General Setup

Setup chunk

Setup reticulate

knitr::opts_chunk$set(fig.width = 8)
knitr::opts_knit$set(root.dir = normalizePath(".."))
knitr::opts_knit$get("root.dir")
[1] "/nas/groups/treutlein/USERS/tomasgomes/projects/pallium_evo"

Load libraries

library(reticulate)
knitr::knit_engines$set(python = reticulate::eng_python)
py_available(initialize = FALSE)
[1] FALSE
use_python(Sys.which("python"))
py_config()
python:         /home/tpires/bin/miniconda3/bin/python
libpython:      /home/tpires/bin/miniconda3/lib/libpython3.8.so
pythonhome:     /home/tpires/bin/miniconda3:/home/tpires/bin/miniconda3
version:        3.8.3 (default, May 19 2020, 18:47:26)  [GCC 7.3.0]
numpy:          /home/tpires/bin/miniconda3/lib/python3.8/site-packages/numpy
numpy_version:  1.18.5

NOTE: Python version was forced by RETICULATE_PYTHON

Set colours for cell types and regions

library(Seurat)
Registered S3 method overwritten by 'spatstat.geom':
  method     from
  print.boxx cli 
Attaching SeuratObject
library(patchwork)
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(tidyverse)
── Attaching packages ──────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ stringr 1.4.0
✓ tidyr   1.1.4     ✓ forcats 0.5.1
✓ readr   2.1.0     
── Conflicts ─────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(ggplot2)
library(parallel)
library(doParallel)
Loading required package: foreach

Attaching package: ‘foreach’

The following objects are masked from ‘package:purrr’:

    accumulate, when

Loading required package: iterators
library(foreach)
library(ggdendro)
library(presto)
Loading required package: Rcpp
Loading required package: data.table
data.table 1.14.2 using 72 threads (see ?getDTthreads).  Latest news: r-datatable.com

Attaching package: ‘data.table’

The following object is masked from ‘package:purrr’:

    transpose

The following objects are masked from ‘package:dplyr’:

    between, first, last
library(scatterpie)

Prepare data

Load Div-seq

meta = read.csv("data/annotations/axolotl_all_umeta.csv", 
                header = T, row.names = 1)
cols_cc = c(
#epen
"#12400c", "#2d6624","#1d4f15", "#174711", "#2d6624", "#3d7f33", "#3b7b30", "#468b3b", "#4f9843","#5dae50", "#66bb58", "#72cd64", "#306a26", "#78d669", "#81e472",
#gaba
"#700209", "#75090e","#7a0f13", "#801517", "#851a1b", "#8a1f1f", "#902423", "#952927", "#9a2d2c","#a03230", "#a53634", "#aa3a39", "#b03f3d","#b54342", "#ba4846", "#c04c4b", "#c5504f", "#ca5554", "#d05959", "#d55e5e","#73050c", "#780c11","#8d2221", "#982b2a","#a23432", "#a83837", "#b2413f", "#b84544", "#bd4a49", "#c85352", #"#cd5756",
#glut
"#054674", "#134d7b","#1d5481", "#265a88", "#2e618e", "#73a4cb", "#366995", "#3e709c", "#4677a2","#4d7ea9", "#5586b0", "#5c8db7", "#6495bd","#6b9cc4", "#7bacd2", "#8ebfe4", "#96c7eb", "#9ecff2", "#18507e", "#18507e","#2a5e8b", "#497ba6","#5889b3", "#6fa0c8","#7fafd6", "#6091ba", "#5182ac", "#3a6c98", "#a6d7f9",
#npc
"#ffb120", "#feb72a","#fdbc34", "#fcc13d", "#fbc745", "#facc4e", "#f9d156", "#f8d65f", "#f8da68","#f7df70", "#f7e479", "#f7e882", "#f7ed8a", "#f7f193", "#eca319"
)
ccnames = unique(sort(meta$cellclusters))
names(cols_cc) = c(ccnames[grepl("epen", ccnames)], ccnames[grepl("GABA", ccnames)],ccnames[grepl("glut", ccnames)],ccnames[grepl("npc", ccnames)])

cols_cc = c(cols_cc, "microglia_8" = "#E6530D", 
            "oligodendrocyte_15" = "#E43D88", "oligodendrocyte_10" = "#F662A5",
            "endothelial_11" = "#712166", "endothelial_12" = "#B0279D", 
            "endothelial_14" = "#BE5AB0")

reg_cols = c("other/unknown_pred" = "#C7CCC7", 
             "medial" = "#52168D", "medial_pred" = "#661CB0", 
             "dorsal" = "#C56007", "dorsal_pred" = "#ED7307", 
             "lateral" = "#118392", "lateral_pred" = "#16A3B6")
reg_cols_simp = c("medial" = "#52168D", "dorsal" = "#C56007", "lateral" = "#118392")

Save necessary data

```r
meta = read.csv(\data/annotations/axolotl_all_umeta.csv\, 
                header = T, row.names = 1)
cols_cc = c(
#epen
\#12400c\, \#2d6624\,\#1d4f15\, \#174711\, \#2d6624\, \#3d7f33\, \#3b7b30\, \#468b3b\, \#4f9843\,\#5dae50\, \#66bb58\, \#72cd64\, \#306a26\, \#78d669\, \#81e472\,
#gaba
\#700209\, \#75090e\,\#7a0f13\, \#801517\, \#851a1b\, \#8a1f1f\, \#902423\, \#952927\, \#9a2d2c\,\#a03230\, \#a53634\, \#aa3a39\, \#b03f3d\,\#b54342\, \#ba4846\, \#c04c4b\, \#c5504f\, \#ca5554\, \#d05959\, \#d55e5e\,\#73050c\, \#780c11\,\#8d2221\, \#982b2a\,\#a23432\, \#a83837\, \#b2413f\, \#b84544\, \#bd4a49\, \#c85352\, #\#cd5756\,
#glut
\#054674\, \#134d7b\,\#1d5481\, \#265a88\, \#2e618e\, \#73a4cb\, \#366995\, \#3e709c\, \#4677a2\,\#4d7ea9\, \#5586b0\, \#5c8db7\, \#6495bd\,\#6b9cc4\, \#7bacd2\, \#8ebfe4\, \#96c7eb\, \#9ecff2\, \#18507e\, \#18507e\,\#2a5e8b\, \#497ba6\,\#5889b3\, \#6fa0c8\,\#7fafd6\, \#6091ba\, \#5182ac\, \#3a6c98\, \#a6d7f9\,
#npc
\#ffb120\, \#feb72a\,\#fdbc34\, \#fcc13d\, \#fbc745\, \#facc4e\, \#f9d156\, \#f8d65f\, \#f8da68\,\#f7df70\, \#f7e479\, \#f7e882\, \#f7ed8a\, \#f7f193\, \#eca319\
)
ccnames = unique(sort(meta$cellclusters))
names(cols_cc) = c(ccnames[grepl(\epen\, ccnames)], ccnames[grepl(\GABA\, ccnames)],ccnames[grepl(\glut\, ccnames)],ccnames[grepl(\npc\, ccnames)])

cols_cc = c(cols_cc, \microglia_8\ = \#E6530D\, 
            \oligodendrocyte_15\ = \#E43D88\, \oligodendrocyte_10\ = \#F662A5\,
            \endothelial_11\ = \#712166\, \endothelial_12\ = \#B0279D\, 
            \endothelial_14\ = \#BE5AB0\)

reg_cols = c(\other/unknown_pred\ = \#C7CCC7\, 
             \medial\ = \#52168D\, \medial_pred\ = \#661CB0\, 
             \dorsal\ = \#C56007\, \dorsal_pred\ = \#ED7307\, 
             \lateral\ = \#118392\, \lateral_pred\ = \#16A3B6\)
reg_cols_simp = c(\medial\ = \#52168D\, \dorsal\ = \#C56007\, \lateral\ = \#118392\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




# Region predictions
Load results from models


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxub3V0bmFtZSA9IFxcZGF0YS9wcm9jZXNzZWQvYXhvbG90bF9wYXJ0cy9kaXZfcmVnaW9uc19kYXRhLm10eFxcXG5vdXRuYW1lMiA9IFxcZGF0YS9wcm9jZXNzZWQvYXhvbG90bF9wYXJ0cy9kaXZfcmVnaW9uc19jb3VudHMubXR4XFxcbmlmKCFmaWxlLmV4aXN0cyhvdXRuYW1lKSl7XG4gIG1ldGFkYXRhX2F4ID0gZGl2X2RhdEBtZXRhLmRhdGFbLGMoXFxzYW1wbGVcXCwgXFxiYXRjaFxcLCBcXGhpZ2hsZXZlbF9jbHVzdGVyc1xcKV1cbiAgd3JpdGUuY3N2KG1ldGFkYXRhX2F4LCBmaWxlID0gXFxkYXRhL3Byb2Nlc3NlZC9heG9sb3RsX3BhcnRzL2Rpdl9yZWdpb25zX21ldGEuY3N2XFwsIFxuICAgICAgICAgICAgY29sLm5hbWVzID0gVCwgcm93Lm5hbWVzID0gVCwgcXVvdGUgPSBGKVxuICB3cml0ZS5jc3YoZGl2X2RhdEBhc3NheXMkUk5BQG1ldGEuZmVhdHVyZXMsIFxuICAgICAgICAgICAgZmlsZSA9IFxcZGF0YS9wcm9jZXNzZWQvYXhvbG90bF9wYXJ0cy9kaXZfcmVnaW9uc19nZW5lcy5jc3ZcXCwgXG4gICAgICAgICAgICBjb2wubmFtZXMgPSBULCByb3cubmFtZXMgPSBULCBxdW90ZSA9IEYpXG4gIFxuICBNYXRyaXg6OndyaXRlTU0oTWF0cml4Ojp0KGRpdl9kYXRAYXNzYXlzJFJOQUBkYXRhKSwgb3V0bmFtZSlcbiAgTWF0cml4Ojp3cml0ZU1NKE1hdHJpeDo6dChkaXZfZGF0QGFzc2F5cyRSTkFAY291bnRzKSwgb3V0bmFtZTIpXG59XG5gYGBcbmBgYCJ9 -->

```r
```r
outname = \data/processed/axolotl_parts/div_regions_data.mtx\
outname2 = \data/processed/axolotl_parts/div_regions_counts.mtx\
if(!file.exists(outname)){
  metadata_ax = div_dat@meta.data[,c(\sample\, \batch\, \highlevel_clusters\)]
  write.csv(metadata_ax, file = \data/processed/axolotl_parts/div_regions_meta.csv\, 
            col.names = T, row.names = T, quote = F)
  write.csv(div_dat@assays$RNA@meta.features, 
            file = \data/processed/axolotl_parts/div_regions_genes.csv\, 
            col.names = T, row.names = T, quote = F)
  
  Matrix::writeMM(Matrix::t(div_dat@assays$RNA@data), outname)
  Matrix::writeMM(Matrix::t(div_dat@assays$RNA@counts), outname2)
}

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Confusion matrices


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxsX3ByZWRfZiA9IGxpc3QuZmlsZXMoXFxyZXN1bHRzL0Rpdi1zZXEvXFwsIHBhdHRlcm4gPSBcXHByZWRzX1xcKVxuYWxsX3ByZWRfZiA9IGFsbF9wcmVkX2ZbZ3JlcGwoXFxsclxcLCBhbGxfcHJlZF9mKSAmICFncmVwbChcXENUXFwsIGFsbF9wcmVkX2YpXVxuIyB0ZXN0IHNldCByZXN1bHRzXG50ZXN0X3JlcyA9IGxhcHBseShhbGxfcHJlZF9mW2dyZXBsKFxcYXguY3N2XFwsIGFsbF9wcmVkX2YpXSwgXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZTAoXFxyZXN1bHRzL0Rpdi1zZXEvXFwsIHgpLCBoZWFkZXIgPSBUKSlcbm5hbWVzKHRlc3RfcmVzKSA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYWxsX3ByZWRfZltncmVwbChcXGF4LmNzdlxcLCBhbGxfcHJlZF9mKV0sIFxcLlxcLCBmaXhlZCA9IFQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB4WzFdKSlcblxuIyBEaXYtc2VxIHJlc3VsdHNcbmRpdl9yZXMgPSBsYXBwbHkoYWxsX3ByZWRfZltncmVwbChcXGRpdlxcLCBhbGxfcHJlZF9mKV0sIFxuICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZTAoXFxyZXN1bHRzL0Rpdi1zZXEvXFwsIHgpLCBoZWFkZXIgPSBUKSlcbm5hbWVzKGRpdl9yZXMpID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhbGxfcHJlZF9mW2dyZXBsKFxcZGl2XFwsIGFsbF9wcmVkX2YpXSwgXFwuXFwsIGZpeGVkID0gVCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgeFsxXSkpXG5gYGBcbmBgYCJ9 -->

```r
```r
all_pred_f = list.files(\results/Div-seq/\, pattern = \preds_\)
all_pred_f = all_pred_f[grepl(\lr\, all_pred_f) & !grepl(\CT\, all_pred_f)]
# test set results
test_res = lapply(all_pred_f[grepl(\ax.csv\, all_pred_f)], 
                  function(x) read.csv(paste0(\results/Div-seq/\, x), header = T))
names(test_res) = unlist(lapply(strsplit(all_pred_f[grepl(\ax.csv\, all_pred_f)], \.\, fixed = T),
                                function(x) x[1]))

# Div-seq results
div_res = lapply(all_pred_f[grepl(\div\, all_pred_f)], 
                 function(x) read.csv(paste0(\results/Div-seq/\, x), header = T))
names(div_res) = unlist(lapply(strsplit(all_pred_f[grepl(\div\, all_pred_f)], \.\, fixed = T),
                               function(x) x[1]))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Compare all with neu/dif (test sets are different so overlap is not complete)


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxsX3ByZWRfZiA9IGxpc3QuZmlsZXMoXFxyZXN1bHRzL0Rpdi1zZXEvXFwsIHBhdHRlcm4gPSBcXHByZWRzX1xcKVxuYWxsX3ByZWRfZiA9IGFsbF9wcmVkX2ZbZ3JlcGwoXFxsclxcLCBhbGxfcHJlZF9mKSAmICFncmVwbChcXENUXFwsIGFsbF9wcmVkX2YpXVxuIyB0ZXN0IHNldCByZXN1bHRzXG50ZXN0X3JlcyA9IGxhcHBseShhbGxfcHJlZF9mW2dyZXBsKFxcYXguY3N2XFwsIGFsbF9wcmVkX2YpXSwgXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZTAoXFxyZXN1bHRzL0Rpdi1zZXEvXFwsIHgpLCBoZWFkZXIgPSBUKSlcbm5hbWVzKHRlc3RfcmVzKSA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYWxsX3ByZWRfZltncmVwbChcXGF4LmNzdlxcLCBhbGxfcHJlZF9mKV0sIFxcLlxcLCBmaXhlZCA9IFQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB4WzFdKSlcblxuIyBEaXYtc2VxIHJlc3VsdHNcbmRpdl9yZXMgPSBsYXBwbHkoYWxsX3ByZWRfZltncmVwbChcXGRpdlxcLCBhbGxfcHJlZF9mKV0sIFxuICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZTAoXFxyZXN1bHRzL0Rpdi1zZXEvXFwsIHgpLCBoZWFkZXIgPSBUKSlcbm5hbWVzKGRpdl9yZXMpID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhbGxfcHJlZF9mW2dyZXBsKFxcZGl2XFwsIGFsbF9wcmVkX2YpXSwgXFwuXFwsIGZpeGVkID0gVCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgeFsxXSkpXG5gYGBcbmBgYCJ9 -->

```r
```r
all_pred_f = list.files(\results/Div-seq/\, pattern = \preds_\)
all_pred_f = all_pred_f[grepl(\lr\, all_pred_f) & !grepl(\CT\, all_pred_f)]
# test set results
test_res = lapply(all_pred_f[grepl(\ax.csv\, all_pred_f)], 
                  function(x) read.csv(paste0(\results/Div-seq/\, x), header = T))
names(test_res) = unlist(lapply(strsplit(all_pred_f[grepl(\ax.csv\, all_pred_f)], \.\, fixed = T),
                                function(x) x[1]))

# Div-seq results
div_res = lapply(all_pred_f[grepl(\div\, all_pred_f)], 
                 function(x) read.csv(paste0(\results/Div-seq/\, x), header = T))
names(div_res) = unlist(lapply(strsplit(all_pred_f[grepl(\div\, all_pred_f)], \.\, fixed = T),
                               function(x) x[1]))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Plot UMAP with regions


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVzdF9sYWJzX2wgPSBsaXN0KClcbmZvcihnIGluIGMoXFxhbGxcXCwgXFxkaWZcXCwgXFxuZXVcXCkpe1xuICBuMSA9IG5hbWVzKHRlc3RfcmVzKVtncmVwbChnLCBuYW1lcyh0ZXN0X3JlcykpICYgZ3JlcGwoXFxsclxcLCBuYW1lcyh0ZXN0X3JlcykpXVxuICB0ZXN0X2xhYnNfbFtbZ11dID0gdGVzdF9yZXNbW24xXV1cbiAgcHJpbnQoZylcbiAgcHJpbnQodGFibGUodGVzdF9sYWJzX2xbW2ddXSR5X3Rlc3QsIHRlc3RfbGFic19sW1tnXV0kcHJlZF9scikpXG59XG5gYGBcbmBgYCJ9 -->

```r
```r
test_labs_l = list()
for(g in c(\all\, \dif\, \neu\)){
  n1 = names(test_res)[grepl(g, names(test_res)) & grepl(\lr\, names(test_res))]
  test_labs_l[[g]] = test_res[[n1]]
  print(g)
  print(table(test_labs_l[[g]]$y_test, test_labs_l[[g]]$pred_lr))
}

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiWzFdIFxcYWxsXFxcbiAgICAgICAgIFxuICAgICAgICAgIGRvcnNhbCBsYXRlcmFsIG1lZGlhbFxuICBkb3JzYWwgICAgMjAxNyAgICAgIDc3ICAgICA4MVxuICBsYXRlcmFsICAgICA2OSAgICAzMDIwICAgICAyMlxuICBtZWRpYWwgICAgICA2MyAgICAgIDY1ICAgMzc1M1xuWzFdIFxcZGlmXFxcbiAgICAgICAgIFxuICAgICAgICAgIGRvcnNhbCBsYXRlcmFsIG1lZGlhbFxuICBkb3JzYWwgICAgMTY4MyAgICAgIDU5ICAgICA5NFxuICBsYXRlcmFsICAgICA2MSAgICAyNjU0ICAgICAyMVxuICBtZWRpYWwgICAgICA1NyAgICAgIDU0ICAgMzQzNVxuWzFdIFxcbmV1XFxcbiAgICAgICAgIFxuICAgICAgICAgIGRvcnNhbCBsYXRlcmFsIG1lZGlhbFxuICBkb3JzYWwgICAgMTczNiAgICAgIDY1ICAgICA5MVxuICBsYXRlcmFsICAgICA3NyAgICAyNzYzICAgICAzNFxuICBtZWRpYWwgICAgICA1MCAgICAgIDUxICAgMzUwOVxuIn0= -->

[1]

      dorsal lateral medial

dorsal 2017 77 81 lateral 69 3020 22 medial 63 65 3753 [1]

      dorsal lateral medial

dorsal 1683 59 94 lateral 61 2654 21 medial 57 54 3435 [1]

      dorsal lateral medial

dorsal 1736 65 91 lateral 77 2763 34 medial 50 51 3509




<!-- rnb-output-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGl2X2xhYnNfbCA9IGxpc3QoKVxuZm9yKGcgaW4gYyhcXGFsbFxcLCBcXGRpZlxcLCBcXG5ldVxcKSl7XG4gIG4xID0gbmFtZXMoZGl2X3JlcylbZ3JlcGwoZywgbmFtZXMoZGl2X3JlcykpICYgZ3JlcGwoXFxsclxcLCBuYW1lcyhkaXZfcmVzKSldXG4gIGRpdl9sYWJzX2xbW2ddXSA9IGRpdl9yZXNbW24xXV1cbn0gXG5gYGBcbmBgYCJ9 -->

```r
```r
div_labs_l = list()
for(g in c(\all\, \dif\, \neu\)){
  n1 = names(div_res)[grepl(g, names(div_res)) & grepl(\lr\, names(div_res))]
  div_labs_l[[g]] = div_res[[n1]]
} 

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Plot changes in proportion


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVzdF9hbGxfbmV1ID0gbWVyZ2UodGVzdF9sYWJzX2wkYWxsLCB0ZXN0X2xhYnNfbCRuZXUsIGJ5ID0gMSlcbnRhYmxlKHRlc3RfYWxsX25ldSRwcmVkX2xyLngsIHRlc3RfYWxsX25ldSRwcmVkX2xyLnkpXG5gYGBcbmBgYCJ9 -->

```r
```r
test_all_neu = merge(test_labs_l$all, test_labs_l$neu, by = 1)
table(test_all_neu$pred_lr.x, test_all_neu$pred_lr.y)

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiICAgICAgICAgXG4gICAgICAgICAgZG9yc2FsIGxhdGVyYWwgbWVkaWFsXG4gIGRvcnNhbCAgICAgNDY2ICAgICAgIDMgICAgIDEzXG4gIGxhdGVyYWwgICAgICA4ICAgICA5NjEgICAgIDEwXG4gIG1lZGlhbCAgICAgICA1ICAgICAgIDQgICAxMzM4XG4ifQ== -->
      dorsal lateral medial

dorsal 466 3 13 lateral 8 961 10 medial 5 4 1338




<!-- rnb-output-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGVzdF9hbGxfZXAgPSBtZXJnZSh0ZXN0X2xhYnNfbCRhbGwsIHRlc3RfbGFic19sJGRpZiwgYnkgPSAxKVxudGFibGUodGVzdF9hbGxfZXAkcHJlZF9sci54LCB0ZXN0X2FsbF9lcCRwcmVkX2xyLnkpXG5gYGBcbmBgYCJ9 -->

```r
```r
test_all_ep = merge(test_labs_l$all, test_labs_l$dif, by = 1)
table(test_all_ep$pred_lr.x, test_all_ep$pred_lr.y)

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiICAgICAgICAgXG4gICAgICAgICAgZG9yc2FsIGxhdGVyYWwgbWVkaWFsXG4gIGRvcnNhbCAgICAgNDczICAgICAgIDUgICAgIDExXG4gIGxhdGVyYWwgICAgICAzICAgICA5MzIgICAgIDExXG4gIG1lZGlhbCAgICAgICA2ICAgICAgIDYgICAxMzM0XG4ifQ== -->
      dorsal lateral medial

dorsal 473 5 11 lateral 3 932 11 medial 6 6 1334




<!-- rnb-output-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGl2X2FsbF9uZXUgPSBtZXJnZShkaXZfbGFic19sJGFsbCwgZGl2X2xhYnNfbCRuZXUsIGJ5ID0gMSlcbnRhYmxlKGRpdl9hbGxfbmV1JHByZWRfbHIueCwgZGl2X2FsbF9uZXUkcHJlZF9sci55KVxuYGBgXG5gYGAifQ== -->

```r
```r
div_all_neu = merge(div_labs_l$all, div_labs_l$neu, by = 1)
table(div_all_neu$pred_lr.x, div_all_neu$pred_lr.y)

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiICAgICAgICAgXG4gICAgICAgICAgZG9yc2FsIGxhdGVyYWwgbWVkaWFsXG4gIGRvcnNhbCAgICA4NjgxICAgICA0NjAgICAgMzI2XG4gIGxhdGVyYWwgICAgNDQzICAgIDY2MDIgICAgIDk2XG4gIG1lZGlhbCAgICAgMTg0ICAgICAxMTEgICAyMzk3XG4ifQ== -->
      dorsal lateral medial

dorsal 8681 460 326 lateral 443 6602 96 medial 184 111 2397




<!-- rnb-output-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGl2X2FsbF9lcCA9IG1lcmdlKGRpdl9sYWJzX2wkYWxsLCBkaXZfbGFic19sJGRpZiwgYnkgPSAxKVxudGFibGUoZGl2X2FsbF9lcCRwcmVkX2xyLngsIGRpdl9hbGxfZXAkcHJlZF9sci55KVxuYGBgXG5gYGAifQ== -->

```r
```r
div_all_ep = merge(div_labs_l$all, div_labs_l$dif, by = 1)
table(div_all_ep$pred_lr.x, div_all_ep$pred_lr.y)

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiICAgICAgICAgXG4gICAgICAgICAgZG9yc2FsIGxhdGVyYWwgbWVkaWFsXG4gIGRvcnNhbCAgICA4NzQ2ICAgICAzNjQgICAgMzU3XG4gIGxhdGVyYWwgICAgNzEwICAgIDYyOTUgICAgMTM2XG4gIG1lZGlhbCAgICAgMjIxICAgICAxMDYgICAyMzY1XG4ifQ== -->
      dorsal lateral medial

dorsal 8746 364 357 lateral 710 6295 136 medial 221 106 2365




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




# Cell Type predictions
Load results from models


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGl2X2RhdCRwcmVkX3JlZ3MgPSBkaXZfcmVzJHByZWRzX2xyX2Rpdl9hbGwkcHJlZF9sclxuRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSBcXHVtYXBfaGFybW9ueVxcLCBncm91cC5ieSA9IFxcaGlnaGxldmVsX2NsdXN0ZXJzXFwsIGxhYmVsID0gVClcbmBgYFxuYGBgIn0= -->

```r
```r
div_dat$pred_regs = div_res$preds_lr_div_all$pred_lr
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \highlevel_clusters\, label = T)

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64," />

<!-- rnb-plot-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSBcXHVtYXBfaGFybW9ueVxcLCBncm91cC5ieSA9IFxccHJlZF9yZWdzXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \pred_regs\)

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64," />

<!-- rnb-plot-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuRmVhdHVyZVBsb3QoZGl2X2RhdCwgcmVkdWN0aW9uID0gXFx1bWFwX2hhcm1vbnlcXCwgZmVhdHVyZXMgPSBjKFxcU0ZSUDFcXCwgXFxXTlQ4QlxcLCBcXFVOQzVDXFwpKVxuXG5yZWdfY29sc19zaW1wID0gYyhcXG1lZGlhbFxcID0gXFwjNTIxNjhEXFwsIFxcZG9yc2FsXFwgPSBcXCNDNTYwMDdcXCwgXFxsYXRlcmFsXFwgPSBcXCMxMTgzOTJcXClcblxucGx0ID0gRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSBcXHVtYXBfaGFybW9ueVxcLCBncm91cC5ieSA9IFxccHJlZF9yZWdzXFwsIHNodWZmbGUgPSBUKStcbiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSByZWdfY29sc19zaW1wKStcbiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMSxcbiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLFxuICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLFxuICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksXG4gICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksXG4gICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksXG4gICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKVxuXG5wZGYoXFxyZXN1bHRzL0Rpdi1zZXEvRGl2c2VxX3Jlc3VsdHMvZGl2c2VxX3VtYXBfcmVnaW9ucy5wZGZcXCwgaGVpZ2h0ID0gMi43LCB3aWR0aCA9IDIuNylcbmBgYFxuYGBgclxucHJpbnQocGx0KVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r
FeaturePlot(div_dat, reduction = \umap_harmony\, features = c(\SFRP1\, \WNT8B\, \UNC5C\))

reg_cols_simp = c(\medial\ = \#52168D\, \dorsal\ = \#C56007\, \lateral\ = \#118392\)

plt = DimPlot(div_dat, reduction = \umap_harmony\, group.by = \pred_regs\, shuffle = T)+
  scale_colour_manual(values = reg_cols_simp)+
  theme(aspect.ratio = 1,
        axis.line = element_blank(),
        axis.ticks = element_blank(),
        axis.text = element_blank(),
        axis.title = element_blank(),
        plot.title = element_blank(),
        legend.position = \none\)

pdf(\results/Div-seq/Divseq_results/divseq_umap_regions.pdf\, height = 2.7, width = 2.7)
print(plt)
dev.off()

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoicG5nIFxuICAyIFxuIn0= -->

png 2




<!-- rnb-output-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64," />

<!-- rnb-plot-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Plot predictions


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG50YWJfY3RfcmVnID0gdGFibGUocGFzdGUwKGRpdl9kYXQkc2FtcGxlLCBcXC4uXFwsIGRpdl9kYXQkaGlnaF9sZXZlbF9hbm5vKSwgZGl2X2RhdCRwcmVkX3JlZ3MpXG50YWJfY3RfcmVnID0gZGF0YS5mcmFtZSh0YWJfY3RfcmVnKVxuXG50YWJfY3RfcmVnJHRpbWUgPSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0YWJfY3RfcmVnJFZhcjEpLCBcXF9cXCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBwYXN0ZTAoeFsxXSwgXFxfd3BpXFwpKSlcbnRhYl9jdF9yZWckY3QgPSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0YWJfY3RfcmVnJFZhcjEpLCBcXC4uXFwsIGZpeGVkID0gVCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB4WzJdKSlcblxuZm9yKHIgaW4gdW5pcXVlKHRhYl9jdF9yZWckdGltZSkpe1xuICBjYyA9IHRhYl9jdF9yZWckdGltZT09clxuICB0YWJfY3RfcmVnJEZyZXFbY2NdID0gdGFiX2N0X3JlZyRGcmVxW2NjXS9zdW0odGFiX2N0X3JlZyRGcmVxW2NjXSlcbn1cblxuZm9yKHIgaW4gdW5pcXVlKHRhYl9jdF9yZWckY3QpKXtcbiAgY2MgPSB0YWJfY3RfcmVnJGN0PT1yXG4gIHRhYl9jdF9yZWckRnJlcVtjY10gPSBzY2FsZXM6OnJlc2NhbGUodGFiX2N0X3JlZyRGcmVxW2NjXSwgYygwLDEpKVxufVxuXG50YWJfY3RfcmVnJGN0ID0gZmFjdG9yKHRhYl9jdF9yZWckY3QsIGxldmVscyA9IGMoXFxtaWNyb2dsaWFcXCwgXFxlbmRvXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcZXBlbmR5bWFsX2FcXCwgXFxlcGVuZHltYWxfcVxcLCBcXE5QQ1xcLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcbmV1cm9uYWxcXCkpXG50YWJfY3RfcmVnJHRpbWUgPSBmYWN0b3IodGFiX2N0X3JlZyR0aW1lLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSByZXYoYyhcXDFfd3BpXFwsIFxcMl93cGlcXCwgXFw0X3dwaVxcLCBcXDZfd3BpXFwsIFxcOF93cGlcXCwgXFwxMl93cGlcXCkpKVxudGFiX2N0X3JlZyRWYXIyID0gZmFjdG9yKHRhYl9jdF9yZWckVmFyMiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhcXG1lZGlhbFxcLFxcZG9yc2FsXFwsXFxsYXRlcmFsXFwpKVxuXG5wbHQgPSBnZ3Bsb3QodGFiX2N0X3JlZywgYWVzKHggPSBWYXIyLCB5ID0gdGltZSwgXG4gICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBGcmVxLCBhbHBoYSA9IEZyZXEsIGNvbG91ciA9IFZhcjIpKStcbiAgZmFjZXRfd3JhcCh+Y3QsIG5jb2wgPSA2KStcbiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSByZWdfY29sc19zaW1wKStcbiAgZ2VvbV9wb2ludCgpK1xuICBsYWJzKHggPSBcXFJlZ2lvblxcLCB5ID0gXFxUaW1lXFwsIGNvbG91ciA9IFxcUmVnaW9uXFwsIFxuICAgICAgIHNpemUgPSBcXE5vcm0uIHByb3BvcnRpb25cXCwgYWxwaGEgPSBcXE5vcm0uIHByb3BvcnRpb25cXCkrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSBcXGJsYWNrXFwsIHNpemUgPSA3KSxcbiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLFxuICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSxcbiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksXG4gICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksXG4gICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LjUpKVxuXG5wZGYoXFxyZXN1bHRzL0Rpdi1zZXEvRGl2c2VxX3Jlc3VsdHMvcHJvcG9ydGlvbl9yZWdpb25fbWFqb3JjdF90aW1lLnBkZlxcLCBoZWlnaHQgPSAyLjcsIHdpZHRoID0gNy41KVxucHJpbnQocGx0KVxuZGV2Lm9mZigpXG5gYGBcbmBgYCJ9 -->

```r
```r

tab_ct_reg = table(paste0(div_dat$sample, \..\, div_dat$high_level_anno), div_dat$pred_regs)
tab_ct_reg = data.frame(tab_ct_reg)

tab_ct_reg$time = unlist(lapply(strsplit(as.character(tab_ct_reg$Var1), \_\), 
                                function(x) paste0(x[1], \_wpi\)))
tab_ct_reg$ct = unlist(lapply(strsplit(as.character(tab_ct_reg$Var1), \..\, fixed = T), 
                                function(x) x[2]))

for(r in unique(tab_ct_reg$time)){
  cc = tab_ct_reg$time==r
  tab_ct_reg$Freq[cc] = tab_ct_reg$Freq[cc]/sum(tab_ct_reg$Freq[cc])
}

for(r in unique(tab_ct_reg$ct)){
  cc = tab_ct_reg$ct==r
  tab_ct_reg$Freq[cc] = scales::rescale(tab_ct_reg$Freq[cc], c(0,1))
}

tab_ct_reg$ct = factor(tab_ct_reg$ct, levels = c(\microglia\, \endo\, 
                                                 \ependymal_a\, \ependymal_q\, \NPC\,
                                                 \neuronal\))
tab_ct_reg$time = factor(tab_ct_reg$time, 
                         levels = rev(c(\1_wpi\, \2_wpi\, \4_wpi\, \6_wpi\, \8_wpi\, \12_wpi\)))
tab_ct_reg$Var2 = factor(tab_ct_reg$Var2, 
                         levels = c(\medial\,\dorsal\,\lateral\))

plt = ggplot(tab_ct_reg, aes(x = Var2, y = time, 
                       size = Freq, alpha = Freq, colour = Var2))+
  facet_wrap(~ct, ncol = 6)+
  scale_colour_manual(values = reg_cols_simp)+
  geom_point()+
  labs(x = \Region\, y = \Time\, colour = \Region\, 
       size = \Norm. proportion\, alpha = \Norm. proportion\)+
  theme_bw()+
  theme(axis.text = element_text(colour = \black\, size = 7),
        axis.text.x = element_text(angle = 30, hjust = 1, vjust = 1),
        axis.title = element_text(size = 7),
        strip.text = element_text(size = 7),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 6.5))

pdf(\results/Div-seq/Divseq_results/proportion_region_majorct_time.pdf\, height = 2.7, width = 7.5)
print(plt)
dev.off()

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

null device 1




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Label smoothing


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYWxsX3ByZWRfZiA9IGxpc3QuZmlsZXMoXFxyZXN1bHRzL0Rpdi1zZXEvXFwsIHBhdHRlcm4gPSBcXHByZWRzX1xcKVxuYWxsX3ByZWRfZiA9IGFsbF9wcmVkX2ZbZ3JlcGwoXFxyZmNcXCwgYWxsX3ByZWRfZikgJiBncmVwbChcXENUXFwsIGFsbF9wcmVkX2YpXVxuIyB0ZXN0IHNldCByZXN1bHRzXG50ZXN0X3JlcyA9IGxhcHBseShhbGxfcHJlZF9mW2dyZXBsKFxcYXguY3N2XFwsIGFsbF9wcmVkX2YpXSwgXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZTAoXFxyZXN1bHRzL0Rpdi1zZXEvXFwsIHgpLCBoZWFkZXIgPSBUKSlcbm5hbWVzKHRlc3RfcmVzKSA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYWxsX3ByZWRfZltncmVwbChcXGF4LmNzdlxcLCBhbGxfcHJlZF9mKV0sIFxcLlxcLCBmaXhlZCA9IFQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB4WzFdKSlcblxuIyBEaXYtc2VxIHJlc3VsdHNcbmRpdl9yZXMgPSBsYXBwbHkoYWxsX3ByZWRfZltncmVwbChcXGRpdlxcLCBhbGxfcHJlZF9mKV0sIFxuICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZTAoXFxyZXN1bHRzL0Rpdi1zZXEvXFwsIHgpLCBoZWFkZXIgPSBUKSlcbm5hbWVzKGRpdl9yZXMpID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhbGxfcHJlZF9mW2dyZXBsKFxcZGl2XFwsIGFsbF9wcmVkX2YpXSwgXFwuXFwsIGZpeGVkID0gVCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgeFsxXSkpXG5gYGBcbmBgYCJ9 -->

```r
```r
all_pred_f = list.files(\results/Div-seq/\, pattern = \preds_\)
all_pred_f = all_pred_f[grepl(\rfc\, all_pred_f) & grepl(\CT\, all_pred_f)]
# test set results
test_res = lapply(all_pred_f[grepl(\ax.csv\, all_pred_f)], 
                  function(x) read.csv(paste0(\results/Div-seq/\, x), header = T))
names(test_res) = unlist(lapply(strsplit(all_pred_f[grepl(\ax.csv\, all_pred_f)], \.\, fixed = T),
                                function(x) x[1]))

# Div-seq results
div_res = lapply(all_pred_f[grepl(\div\, all_pred_f)], 
                 function(x) read.csv(paste0(\results/Div-seq/\, x), header = T))
names(div_res) = unlist(lapply(strsplit(all_pred_f[grepl(\div\, all_pred_f)], \.\, fixed = T),
                               function(x) x[1]))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Save new metadata


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGl2X2RhdCA9IEZpbmRDbHVzdGVycyhkaXZfZGF0LCByZXNvbHV0aW9uID0gYygyLCA1LCAxMCwgMjAsIDI1LCA1MCksIGFsZ29yaXRobSA9IDIsIHZlcmJvc2UgPSBGKVxuRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSBcXHVtYXBfaGFybW9ueVxcLCBncm91cC5ieSA9IFxcUk5BX3Nubl9yZXMuMlxcLCBsYWJlbCA9IFQpK05vTGVnZW5kKClcbkRpbVBsb3QoZGl2X2RhdCwgcmVkdWN0aW9uID0gXFx1bWFwX2hhcm1vbnlcXCwgZ3JvdXAuYnkgPSBcXFJOQV9zbm5fcmVzLjVcXCwgbGFiZWwgPSBUKStOb0xlZ2VuZCgpXG5EaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9IFxcdW1hcF9oYXJtb255XFwsIGdyb3VwLmJ5ID0gXFxSTkFfc25uX3Jlcy4xMFxcLCBsYWJlbCA9IFQpK05vTGVnZW5kKClcbkRpbVBsb3QoZGl2X2RhdCwgcmVkdWN0aW9uID0gXFx1bWFwX2hhcm1vbnlcXCwgZ3JvdXAuYnkgPSBcXFJOQV9zbm5fcmVzLjIwXFwsIGxhYmVsID0gVCkrTm9MZWdlbmQoKVxuRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSBcXHVtYXBfaGFybW9ueVxcLCBncm91cC5ieSA9IFxcUk5BX3Nubl9yZXMuMjVcXCwgbGFiZWwgPSBUKStOb0xlZ2VuZCgpXG5EaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9IFxcdW1hcF9oYXJtb255XFwsIGdyb3VwLmJ5ID0gXFxSTkFfc25uX3Jlcy41MFxcLCBsYWJlbCA9IFQpK05vTGVnZW5kKClcblxudGFiX292ZXJjbCA9IHRhYmxlKGRpdl9kYXQkUk5BX3Nubl9yZXMuMjAsIGRpdl9kYXQkcHJlZF9jdGFsbClcbnRhYl9vdmVyY2wgPSB0YWJfb3ZlcmNsL3Jvd1N1bXModGFiX292ZXJjbClcbmFwcGx5KHRhYl9vdmVyY2wsIDEsIGZ1bmN0aW9uKHgpIGNvbG5hbWVzKHRhYl9vdmVyY2wpW3doaWNoLm1heCh4KV0pXG5zb3J0KHRhYmxlKGFwcGx5KHRhYl9vdmVyY2wsIDEsIGZ1bmN0aW9uKHgpIGNvbG5hbWVzKHRhYl9vdmVyY2wpW3doaWNoLm1heCh4KV0pKSlcbnNvcnQoYXBwbHkodGFiX292ZXJjbCwgMSwgbWF4KSlcbnN1bShhcHBseSh0YWJfb3ZlcmNsLCAxLCBtYXgpPC41KS9ucm93KHRhYl9vdmVyY2wpXG5cbmRmX292ZXJjbCA9IGRhdGEuZnJhbWUodGFiX292ZXJjbClcbm5vbWFqZGYgPSB1bmlxdWUoZGZfb3ZlcmNsW2RmX292ZXJjbCRGcmVxPC4zMyxjKDEsMSldKVxuY29sbmFtZXMobm9tYWpkZikgPSBjb2xuYW1lcyhkZl9vdmVyY2wpWzE6Ml1cbm1hamRmID0gZGZfb3ZlcmNsW2RmX292ZXJjbCRGcmVxPj0uMzMsMToyXVxubWF0Y2hfZGYgPSByYmluZChtYWpkZiwgbm9tYWpkZlshKG5vbWFqZGYkVmFyMSAlaW4lIG1hamRmJFZhcjEpLF0pXG5cbmRpdl9kYXQkcHJlZF9zbW9vdGhfMjAgPSBtYXRjaF9kZiRWYXIyW21hdGNoKGRpdl9kYXQkUk5BX3Nubl9yZXMuMjAsIG1hdGNoX2RmJFZhcjEpXVxuRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSBcXHVtYXBfaGFybW9ueVxcLCBncm91cC5ieSA9IFxccHJlZF9zbW9vdGhfMjBcXCwgbGFiZWwgPSBUKStOb0xlZ2VuZCgpXG5EaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9IFxcdW1hcF9oYXJtb255XFwsIGdyb3VwLmJ5ID0gXFxwcmVkX2N0YWxsXFwsIGxhYmVsID0gVCkrTm9MZWdlbmQoKVxuYGBgXG5gYGAifQ== -->

```r
```r
div_dat = FindClusters(div_dat, resolution = c(2, 5, 10, 20, 25, 50), algorithm = 2, verbose = F)
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \RNA_snn_res.2\, label = T)+NoLegend()
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \RNA_snn_res.5\, label = T)+NoLegend()
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \RNA_snn_res.10\, label = T)+NoLegend()
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \RNA_snn_res.20\, label = T)+NoLegend()
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \RNA_snn_res.25\, label = T)+NoLegend()
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \RNA_snn_res.50\, label = T)+NoLegend()

tab_overcl = table(div_dat$RNA_snn_res.20, div_dat$pred_ctall)
tab_overcl = tab_overcl/rowSums(tab_overcl)
apply(tab_overcl, 1, function(x) colnames(tab_overcl)[which.max(x)])
sort(table(apply(tab_overcl, 1, function(x) colnames(tab_overcl)[which.max(x)])))
sort(apply(tab_overcl, 1, max))
sum(apply(tab_overcl, 1, max)<.5)/nrow(tab_overcl)

df_overcl = data.frame(tab_overcl)
nomajdf = unique(df_overcl[df_overcl$Freq<.33,c(1,1)])
colnames(nomajdf) = colnames(df_overcl)[1:2]
majdf = df_overcl[df_overcl$Freq>=.33,1:2]
match_df = rbind(majdf, nomajdf[!(nomajdf$Var1 %in% majdf$Var1),])

div_dat$pred_smooth_20 = match_df$Var2[match(div_dat$RNA_snn_res.20, match_df$Var1)]
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \pred_smooth_20\, label = T)+NoLegend()
DimPlot(div_dat, reduction = \umap_harmony\, group.by = \pred_ctall\, label = T)+NoLegend()

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## Dot plots
Region changes in major predicted cell types


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubWV0YV9kaXZfcHJlZCA9IGRpdl9kYXRAbWV0YS5kYXRhWyxjKFxcc2FtcGxlXFwsIFxcaGlnaF9sZXZlbF9hbm5vXFwsIFxcaGlnaGxldmVsX2NsdXN0ZXJzXFwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxccHJlZF9yZWdzXFwsIFxccHJlZF9jdGFsbFxcLCBcXHByZWRfc21vb3RoXzIwXFwpXVxud3JpdGUuY3N2KG1ldGFfZGl2X3ByZWQsIGZpbGUgPSBcXHJlc3VsdHMvRGl2LXNlcS9kaXZzZXFfcHJlZGljdGVkX21ldGFkYXRhLmNzdlxcLCBcbiAgICAgICAgICBjb2wubmFtZXMgPSBULCByb3cubmFtZXMgPSBULCBxdW90ZSA9IEYpXG5gYGBcbmBgYCJ9 -->

```r
```r
meta_div_pred = div_dat@meta.data[,c(\sample\, \high_level_anno\, \highlevel_clusters\, 
                                     \pred_regs\, \pred_ctall\, \pred_smooth_20\)]
write.csv(meta_div_pred, file = \results/Div-seq/divseq_predicted_metadata.csv\, 
          col.names = T, row.names = T, quote = F)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Scatterpie of previous plot


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxudGFiX2N0X3JlZyA9IHRhYmxlKG1ldGFfZGl2X3ByZWQkc2FtcGxlLFxuICAgICAgICAgICAgICAgICAgIHBhc3RlMChtZXRhX2Rpdl9wcmVkJHByZWRfc21vb3RoXzIwLCBcIi4uXCIsIG1ldGFfZGl2X3ByZWQkcHJlZF9yZWdzKSlcbnRhYl9jdF9yZWcgPSBkYXRhLmZyYW1lKHRhYl9jdF9yZWcpXG5cbnRhYl9jdF9yZWckdGltZSA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdF9yZWckVmFyMSksIFwiX1wiKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHBhc3RlMCh4WzFdLCBcIl93cGlcIikpKVxudGFiX2N0X3JlZyRwcmVkX3JlZyA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdF9yZWckVmFyMiksIFwiLi5cIiwgZml4ZWQgPSBUKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHhbMl0pKVxudGFiX2N0X3JlZyRwcmVkX2N0ID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhcy5jaGFyYWN0ZXIodGFiX2N0X3JlZyRWYXIyKSwgXCIuLlwiLCBmaXhlZCA9IFQpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgeFsxXSkpXG5cbnRhYl9jdF9yZWckcHJvcCA9IHRhYl9jdF9yZWckRnJlcVxubGFyZ2VzdF9jdCA9IGMoKVxuZm9yKHIgaW4gdW5pcXVlKHRhYl9jdF9yZWckdGltZSkpeyAjIGdldCB0aGUgeCBtb3N0IGZyZXF1ZW50IGNlbGwgdHlwZXMvdHBcbiAgY2MgPSB0YWJfY3RfcmVnJHRpbWU9PXJcbiAgdGFiX2N0X3JlZyRwcm9wW2NjXSA9IHRhYl9jdF9yZWckcHJvcFtjY10vc3VtKHRhYl9jdF9yZWckcHJvcFtjY10pXG4gIGxhcmdlc3RfY3QgPSB1bmlxdWUoYyhsYXJnZXN0X2N0LCBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYl9jdF9yZWckcHJlZF9jdFtjY11bb3JkZXIodGFiX2N0X3JlZyRwcm9wW2NjXSwgZGVjcmVhc2luZyA9IFQpXVsxOjhdKSlcbiAgbGFyZ2VzdF9jdCA9IGxhcmdlc3RfY3RbZ3JlcGwoXCJfXCIsIGxhcmdlc3RfY3QpXVxufVxuXG50YWJfY3RfcmVnID0gdGFiX2N0X3JlZ1t0YWJfY3RfcmVnJHByZWRfY3QgJWluJSBsYXJnZXN0X2N0LF1cblxudGFiX3RpbWVjdF9yZWcgPSB0KHJlc2hhcGUyOjpkY2FzdChwcmVkX3JlZ350aW1lK3ByZWRfY3QsIHZhbHVlLnZhciA9IFwiRnJlcVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRhYl9jdF9yZWcsIGZpbGwgPSAwKSlcbmNvbG5hbWVzKHRhYl90aW1lY3RfcmVnKSA9IHRhYl90aW1lY3RfcmVnWzEsXVxudGFiX3RpbWVjdF9yZWcgPSBkYXRhLmZyYW1lKHRhYl90aW1lY3RfcmVnWy0xLF0pXG50YWJfdGltZWN0X3JlZyR0aW1lID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChyb3duYW1lcyh0YWJfdGltZWN0X3JlZyksIFwiX3dwaV9cIiksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgcGFzdGUwKHhbMV0sIFwiX3dwaVwiKSkpXG50YWJfdGltZWN0X3JlZyRjdCA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQocm93bmFtZXModGFiX3RpbWVjdF9yZWcpLCBcIl93cGlfXCIpLCBmdW5jdGlvbih4KSB4WzJdKSlcbnRhYl90aW1lY3RfcmVnJGRvcnNhbCA9IGFzLm51bWVyaWModGFiX3RpbWVjdF9yZWckZG9yc2FsKVxudGFiX3RpbWVjdF9yZWckbGF0ZXJhbCA9IGFzLm51bWVyaWModGFiX3RpbWVjdF9yZWckbGF0ZXJhbClcbnRhYl90aW1lY3RfcmVnJG1lZGlhbCA9IGFzLm51bWVyaWModGFiX3RpbWVjdF9yZWckbWVkaWFsKVxuXG50YWJfdGltZWN0X3JlZyA9IHRhYl90aW1lY3RfcmVnW3RhYl90aW1lY3RfcmVnJGN0IT1cIm1pY3JvZ2xpYV84XCIsXVxuXG5wcm9wc3RpbWUgPSB1bmxpc3QodW5uYW1lKHRhcHBseShhcHBseSh0YWJfdGltZWN0X3JlZ1ssMTozXSwgMSwgc3VtKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJfdGltZWN0X3JlZyR0aW1lLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkpKVxuXG50YWJfdGltZWN0X3JlZyRwcm9wc3RpbWUgPSBwcm9wc3RpbWVbcm93bmFtZXModGFiX3RpbWVjdF9yZWcpXVxuXG5mb3IociBpbiB1bmlxdWUodGFiX3RpbWVjdF9yZWckY3QpKXtcbiAgY2MgPSB0YWJfdGltZWN0X3JlZyRjdD09clxuICB0YWJfdGltZWN0X3JlZyRwcm9wc3RpbWVbY2NdID0gc2NhbGVzOjpyZXNjYWxlKHRhYl90aW1lY3RfcmVnJHByb3BzdGltZVtjY10sIGMoMCwxKSlcbn1cblxudGFiX3RpbWVjdF9yZWckZ2cgPSAxOm5yb3codGFiX3RpbWVjdF9yZWcpXG5cbnRhYl90aW1lY3RfcmVnJHRpbWUgPSBmYWN0b3IodGFiX3RpbWVjdF9yZWckdGltZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoXCIxX3dwaVwiLFwiMl93cGlcIixcIjRfd3BpXCIsXCI2X3dwaVwiLFwiOF93cGlcIixcIjEyX3dwaVwiKSlcbnRhYl90aW1lY3RfcmVnJGN0ID0gZmFjdG9yKHRhYl90aW1lY3RfcmVnJGN0LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHJldihjKFwiZXBlbl9jbHVzXzRcIiwgXCJlcGVuX2NsdXNfM1wiLCBcImVwZW5fY2x1c18wXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibnBjX1NVQlNFVF83XCIsXCJucGNfU1VCU0VUXzhcIixcIm5wY19TVUJTRVRfM1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5wY19TVUJTRVRfNFwiLFwibnBjX1NVQlNFVF8xMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdsdXRfU1VCU0VUXzEwXCIsIFwiZ2x1dF9TVUJTRVRfM1wiLCBcImdsdXRfU1VCU0VUXzFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnbHV0X1NVQlNFVF80XCIsIFwiZ2x1dF9TVUJTRVRfMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkdBQkFfU1VCU0VUXzNcIixcIkdBQkFfU1VCU0VUXzRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJHQUJBX1NVQlNFVF8xXCIsXCJHQUJBX1NVQlNFVF8xNFwiKSkpXG5cbnNjcGx0ID0gZ2dwbG90KCkrXG4gIGdlb21fc2NhdHRlcnBpZShhZXMoeD1hcy5udW1lcmljKHRpbWUpLCB5PWFzLm51bWVyaWMoY3QpLCBcbiAgICAgICAgICAgICAgICAgICAgICBncm91cD1nZywgcj1wcm9wc3RpbWUvMiksIGRhdGE9dGFiX3RpbWVjdF9yZWcsXG4gICAgICAgICAgICAgICAgICBjb2xzPWMoXCJtZWRpYWxcIiwgXCJkb3JzYWxcIiwgXCJsYXRlcmFsXCIpKSsgXG4gIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsZXZlbHModGFiX3RpbWVjdF9yZWckdGltZSksXG4gICAgICAgICAgICAgICAgICAgICBicmVha3MgPSAxOjYpK1xuICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gbGV2ZWxzKHRhYl90aW1lY3RfcmVnJGN0KSxcbiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IDE6bGVuZ3RoKGxldmVscyh0YWJfdGltZWN0X3JlZyRjdCkpKStcbiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcmVnX2NvbHNfc2ltcCkrXG4gIGNvb3JkX2VxdWFsKCkrXG4gIGxhYnMoeCA9IFwidGltZVwiLCB5ID0gXCJjZWxsIHR5cGVcIiwgZmlsbCA9IFwicmVnaW9uXCIpK1xuICB0aGVtZV9idygpK1xuICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gXCJibGFja1wiLCBzaXplID0gNiksXG4gICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSksXG4gICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IFwibm9uZVwiKVxuXG5wZGYoXCJyZXN1bHRzL0Rpdi1zZXEvRGl2c2VxX3Jlc3VsdHMvcHJvcG9ydGlvbl9yZWdpb25fcHJlZGN0X3RpbWVfcGllLnBkZlwiLCBoZWlnaHQgPSA3LjUsIHdpZHRoID0gMylcbnByaW50KHNjcGx0KVxuZGV2Lm9mZigpXG5gYGAifQ== -->

```r
tab_ct_reg = table(meta_div_pred$sample,
                   paste0(meta_div_pred$pred_smooth_20, "..", meta_div_pred$pred_regs))
tab_ct_reg = data.frame(tab_ct_reg)

tab_ct_reg$time = unlist(lapply(strsplit(as.character(tab_ct_reg$Var1), "_"), 
                                function(x) paste0(x[1], "_wpi")))
tab_ct_reg$pred_reg = unlist(lapply(strsplit(as.character(tab_ct_reg$Var2), "..", fixed = T), 
                                function(x) x[2]))
tab_ct_reg$pred_ct = unlist(lapply(strsplit(as.character(tab_ct_reg$Var2), "..", fixed = T), 
                                function(x) x[1]))

tab_ct_reg$prop = tab_ct_reg$Freq
largest_ct = c()
for(r in unique(tab_ct_reg$time)){ # get the x most frequent cell types/tp
  cc = tab_ct_reg$time==r
  tab_ct_reg$prop[cc] = tab_ct_reg$prop[cc]/sum(tab_ct_reg$prop[cc])
  largest_ct = unique(c(largest_ct, 
                        tab_ct_reg$pred_ct[cc][order(tab_ct_reg$prop[cc], decreasing = T)][1:8]))
  largest_ct = largest_ct[grepl("_", largest_ct)]
}

tab_ct_reg = tab_ct_reg[tab_ct_reg$pred_ct %in% largest_ct,]

tab_timect_reg = t(reshape2::dcast(pred_reg~time+pred_ct, value.var = "Freq", 
                                   data = tab_ct_reg, fill = 0))
colnames(tab_timect_reg) = tab_timect_reg[1,]
tab_timect_reg = data.frame(tab_timect_reg[-1,])
tab_timect_reg$time = unlist(lapply(strsplit(rownames(tab_timect_reg), "_wpi_"), 
                                    function(x) paste0(x[1], "_wpi")))
tab_timect_reg$ct = unlist(lapply(strsplit(rownames(tab_timect_reg), "_wpi_"), function(x) x[2]))
tab_timect_reg$dorsal = as.numeric(tab_timect_reg$dorsal)
tab_timect_reg$lateral = as.numeric(tab_timect_reg$lateral)
tab_timect_reg$medial = as.numeric(tab_timect_reg$medial)

tab_timect_reg = tab_timect_reg[tab_timect_reg$ct!="microglia_8",]

propstime = unlist(unname(tapply(apply(tab_timect_reg[,1:3], 1, sum), 
                                 tab_timect_reg$time, function(x) x/sum(x))))

tab_timect_reg$propstime = propstime[rownames(tab_timect_reg)]

for(r in unique(tab_timect_reg$ct)){
  cc = tab_timect_reg$ct==r
  tab_timect_reg$propstime[cc] = scales::rescale(tab_timect_reg$propstime[cc], c(0,1))
}

tab_timect_reg$gg = 1:nrow(tab_timect_reg)

tab_timect_reg$time = factor(tab_timect_reg$time, 
                             levels = c("1_wpi","2_wpi","4_wpi","6_wpi","8_wpi","12_wpi"))
tab_timect_reg$ct = factor(tab_timect_reg$ct, 
                           levels = rev(c("epen_clus_4", "epen_clus_3", "epen_clus_0",
                                      "npc_SUBSET_7","npc_SUBSET_8","npc_SUBSET_3",
                                      "npc_SUBSET_4","npc_SUBSET_10",
                                      "glut_SUBSET_10", "glut_SUBSET_3", "glut_SUBSET_1",
                                      "glut_SUBSET_4", "glut_SUBSET_0",
                                      "GABA_SUBSET_3","GABA_SUBSET_4",
                                      "GABA_SUBSET_1","GABA_SUBSET_14")))

scplt = ggplot()+
  geom_scatterpie(aes(x=as.numeric(time), y=as.numeric(ct), 
                      group=gg, r=propstime/2), data=tab_timect_reg,
                  cols=c("medial", "dorsal", "lateral"))+ 
  scale_x_continuous(labels = levels(tab_timect_reg$time),
                     breaks = 1:6)+
  scale_y_continuous(labels = levels(tab_timect_reg$ct),
                     breaks = 1:length(levels(tab_timect_reg$ct)))+
  scale_fill_manual(values = reg_cols_simp)+
  coord_equal()+
  labs(x = "time", y = "cell type", fill = "region")+
  theme_bw()+
  theme(axis.text = element_text(colour = "black", size = 6),
        axis.title = element_text(size = 6.5),
        legend.position = "none")

pdf("results/Div-seq/Divseq_results/proportion_region_predct_time_pie.pdf", height = 7.5, width = 3)
print(scplt)
dev.off()

Scatterpie of major cell types

# count time vs ct..region
major_ct_pred = unlist(lapply(strsplit(meta_div_pred$pred_ctall, "_"), function(x) x[1]))
tab_ct_reg = table(meta_div_pred$sample,
                   paste0(major_ct_pred, "..", meta_div_pred$pred_regs))
tab_ct_reg = data.frame(tab_ct_reg)

# unravel
tab_ct_reg$time = unlist(lapply(strsplit(as.character(tab_ct_reg$Var1), "_"), 
                                function(x) paste0(x[1], "_wpi")))
tab_ct_reg$pred_reg = unlist(lapply(strsplit(as.character(tab_ct_reg$Var2), "..", fixed = T), 
                                function(x) x[2]))
tab_ct_reg$pred_ct = unlist(lapply(strsplit(as.character(tab_ct_reg$Var2), "..", fixed = T), 
                                function(x) x[1]))

# get proportions
tab_ct_reg$prop = tab_ct_reg$Freq
for(r in unique(tab_ct_reg$time)){
  cc = tab_ct_reg$time==r
  tab_ct_reg$prop[cc] = tab_ct_reg$prop[cc]/sum(tab_ct_reg$prop[cc])
}

# get counts per region
tab_timect_reg = t(reshape2::dcast(pred_reg~time+pred_ct, value.var = "Freq", 
                                   data = tab_ct_reg, fill = 0))
colnames(tab_timect_reg) = tab_timect_reg[1,]
tab_timect_reg = data.frame(tab_timect_reg[-1,])

# unravel
tab_timect_reg$time = unlist(lapply(strsplit(rownames(tab_timect_reg), "_wpi_"), 
                                    function(x) paste0(x[1], "_wpi")))
tab_timect_reg$ct = unlist(lapply(strsplit(rownames(tab_timect_reg), "_wpi_"), function(x) x[2]))
tab_timect_reg$dorsal = as.numeric(tab_timect_reg$dorsal)
tab_timect_reg$lateral = as.numeric(tab_timect_reg$lateral)
tab_timect_reg$medial = as.numeric(tab_timect_reg$medial)

# proportions of cell type per time
propstime = unlist(unname(tapply(apply(tab_timect_reg[,1:3], 1, sum), 
                                 tab_timect_reg$time, function(x) x/sum(x))))
tab_timect_reg$propstime = propstime[rownames(tab_timect_reg)]

# scale the proportions per cell type
for(r in unique(tab_timect_reg$ct)){
  cc = tab_timect_reg$ct==r
  tab_timect_reg$propstime[cc] = scales::rescale(tab_timect_reg$propstime[cc], c(0,1))
}
tab_timect_reg$gg = 1:nrow(tab_timect_reg) #required for plot

tab_timect_reg$time = factor(tab_timect_reg$time, 
                             levels = c("1_wpi","2_wpi","4_wpi","6_wpi","8_wpi","12_wpi"))
tab_timect_reg$ct = factor(tab_timect_reg$ct, 
                           levels = rev(c("epen", "npc", "glut", "GABA","oligodendrocyte",
                                      "microglia", "endothelial")))

scplt = ggplot()+
  geom_scatterpie(aes(x=as.numeric(time), y=as.numeric(ct), 
                      group=gg, r=propstime/2), data=tab_timect_reg,
                  cols=c("medial", "dorsal", "lateral"))+ 
  scale_x_continuous(labels = levels(tab_timect_reg$time),
                     breaks = 1:6)+
  scale_y_continuous(labels = levels(tab_timect_reg$ct),
                     breaks = 1:length(levels(tab_timect_reg$ct)))+
  scale_fill_manual(values = reg_cols_simp)+
  coord_equal()+
  labs(x = "time", y = "cell type", fill = "region")+
  theme_bw()+
  theme(axis.text = element_text(colour = "black", size = 6),
        axis.title = element_text(size = 6.5),
        legend.position = "none")

# add global cell type proportions per region
prop_df = data.frame(prop.table(table(major_ct_pred, meta_div_pred$pred_regs)))
prop_df$major_ct_pred = factor(prop_df$major_ct_pred, levels = levels(tab_timect_reg$ct))

col_prop = ggplot()+
  geom_col(data = prop_df, mapping = aes(x = Freq, y = major_ct_pred, fill = Var2))+
  scale_x_continuous(expand = c(0,0), limits = c(0,.37))+
  scale_fill_manual(values = reg_cols_simp)+
  labs(x = "proportion")+
  theme_void()+
  theme(legend.position = "none",
        axis.line.y = element_line(),
        axis.text.x = element_text(colour = "black", size = 6, 
                                   angle = 30, vjust = 1, hjust = 1),
        axis.title.x = element_text(size = 6.5),
        axis.line.x = element_line(),
        axis.ticks.x = element_line())

pdf("results/Div-seq/Divseq_results/proportion_region_predct_time_pie_bar.pdf", 
    height = 3, width = 3.65)
scplt + col_prop + plot_layout(widths = c(1,0.2)) & theme(plot.margin = unit(c(0,0,0,0), "cm"))
dev.off()

Barplots

Predicted cell type abundances

tab_ctall = data.frame(table(meta_div_pred$sample,meta_div_pred$pred_ctall))
tab_ctall$majorct = unlist(lapply(strsplit(as.character(tab_ctall$Var2), "_"), function(x) x[1]))
tab_ctall$majorct = factor(tab_ctall$majorct, 
                           levels = c("epen", "npc", "glut", "GABA", "microglia",
                                      "oligodendrocyte", "endothelial"))
ctord = sort(table(meta_div_pred$pred_ctall))
tab_ctall$Var2 = factor(tab_ctall$Var2, levels = names(ctord))

pdf("results/Div-seq/Divseq_results/predCellType_abundance_timepoint.pdf", height = 9.5, width = 7.5)
ggplot(tab_ctall, aes(x = Freq, y = Var2, fill = Var1))+
  facet_grid(majorct~Var1, scales = "free", space = "free_y")+
  geom_col(colour = "grey50")+
  scale_x_continuous(expand = c(0,0))+
  scale_fill_manual(values = RColorBrewer::brewer.pal(6, "PuBuGn"))+
  theme_bw()+
  theme(axis.text.x = element_text(size = 6, colour = "black"),
        axis.text.y = element_text(size = 6.5, colour = "black"),
        strip.text = element_text(size = 6.5),
        legend.position = "none")
dev.off()

pdf("results/Div-seq/Divseq_results/predCellType_abundance_celltype.pdf", height = 9.5, width = 7.5)
ggplot(tab_ctall, aes(x = Freq, y = Var2, fill = Var2))+
  facet_grid(majorct~Var1, scales = "free", space = "free_y")+
  geom_col()+
  scale_x_continuous(expand = c(0,0))+
  scale_fill_manual(values = cols_cc)+
  theme_bw()+
  theme(axis.text.x = element_text(size = 6, colour = "black"),
        axis.text.y = element_text(size = 6.5, colour = "black"),
        strip.text = element_text(size = 6.5),
        legend.position = "none")
dev.off()

Predicted cell type abundances, with predicted region

```r

pdf(\results/Div-seq/Divseq_results/proportion_region_predct_time_pie_bar.pdf\, 
    height = 3, width = 3.65)
scplt + col_prop + plot_layout(widths = c(1,0.2)) & theme(plot.margin = unit(c(0,0,0,0), \cm\))
dev.off()

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

null device 1




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Barplots for glut and NPC


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudGFiX2N0YWxsID0gZGF0YS5mcmFtZSh0YWJsZShtZXRhX2Rpdl9wcmVkJHNhbXBsZSxtZXRhX2Rpdl9wcmVkJHByZWRfY3RhbGwpKVxudGFiX2N0YWxsJG1ham9yY3QgPSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0YWJfY3RhbGwkVmFyMiksIFxcX1xcKSwgZnVuY3Rpb24oeCkgeFsxXSkpXG50YWJfY3RhbGwkbWFqb3JjdCA9IGZhY3Rvcih0YWJfY3RhbGwkbWFqb3JjdCwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKFxcZXBlblxcLCBcXG5wY1xcLCBcXGdsdXRcXCwgXFxHQUJBXFwsIFxcbWljcm9nbGlhXFwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcb2xpZ29kZW5kcm9jeXRlXFwsIFxcZW5kb3RoZWxpYWxcXCkpXG5jdG9yZCA9IHNvcnQodGFibGUobWV0YV9kaXZfcHJlZCRwcmVkX2N0YWxsKSlcbnRhYl9jdGFsbCRWYXIyID0gZmFjdG9yKHRhYl9jdGFsbCRWYXIyLCBsZXZlbHMgPSBuYW1lcyhjdG9yZCkpXG5cbnBkZihcXHJlc3VsdHMvRGl2LXNlcS9EaXZzZXFfcmVzdWx0cy9wcmVkQ2VsbFR5cGVfYWJ1bmRhbmNlX3RpbWVwb2ludC5wZGZcXCwgaGVpZ2h0ID0gOS41LCB3aWR0aCA9IDcuNSlcbmdncGxvdCh0YWJfY3RhbGwsIGFlcyh4ID0gRnJlcSwgeSA9IFZhcjIsIGZpbGwgPSBWYXIxKSkrXG4gIGZhY2V0X2dyaWQobWFqb3JjdH5WYXIxLCBzY2FsZXMgPSBcXGZyZWVcXCwgc3BhY2UgPSBcXGZyZWVfeVxcKStcbiAgZ2VvbV9jb2woY29sb3VyID0gXFxncmV5NTBcXCkrXG4gIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpK1xuICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoNiwgXFxQdUJ1R25cXCkpK1xuICB0aGVtZV9idygpK1xuICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgY29sb3VyID0gXFxibGFja1xcKSxcbiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSwgY29sb3VyID0gXFxibGFja1xcKSxcbiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNi41KSxcbiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
tab_ctall = data.frame(table(meta_div_pred$sample,meta_div_pred$pred_ctall))
tab_ctall$majorct = unlist(lapply(strsplit(as.character(tab_ctall$Var2), \_\), function(x) x[1]))
tab_ctall$majorct = factor(tab_ctall$majorct, 
                           levels = c(\epen\, \npc\, \glut\, \GABA\, \microglia\,
                                      \oligodendrocyte\, \endothelial\))
ctord = sort(table(meta_div_pred$pred_ctall))
tab_ctall$Var2 = factor(tab_ctall$Var2, levels = names(ctord))

pdf(\results/Div-seq/Divseq_results/predCellType_abundance_timepoint.pdf\, height = 9.5, width = 7.5)
ggplot(tab_ctall, aes(x = Freq, y = Var2, fill = Var1))+
  facet_grid(majorct~Var1, scales = \free\, space = \free_y\)+
  geom_col(colour = \grey50\)+
  scale_x_continuous(expand = c(0,0))+
  scale_fill_manual(values = RColorBrewer::brewer.pal(6, \PuBuGn\))+
  theme_bw()+
  theme(axis.text.x = element_text(size = 6, colour = \black\),
        axis.text.y = element_text(size = 6.5, colour = \black\),
        strip.text = element_text(size = 6.5),
        legend.position = \none\)
dev.off()

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

null device 1




<!-- rnb-output-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGRmKFxccmVzdWx0cy9EaXYtc2VxL0RpdnNlcV9yZXN1bHRzL3ByZWRDZWxsVHlwZV9hYnVuZGFuY2VfY2VsbHR5cGUucGRmXFwsIGhlaWdodCA9IDkuNSwgd2lkdGggPSA3LjUpXG5gYGBcbmBgYHJcbmdncGxvdCh0YWJfY3RhbGwsIGFlcyh4ID0gRnJlcSwgeSA9IFZhcjIsIGZpbGwgPSBWYXIyKSkrXG4gIGZhY2V0X2dyaWQobWFqb3JjdH5WYXIxLCBzY2FsZXMgPSBcXGZyZWVcXCwgc3BhY2UgPSBcXGZyZWVfeVxcKStcbiAgZ2VvbV9jb2woKStcbiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkrXG4gIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbHNfY2MpK1xuICB0aGVtZV9idygpK1xuICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgY29sb3VyID0gXFxibGFja1xcKSxcbiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSwgY29sb3VyID0gXFxibGFja1xcKSxcbiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNi41KSxcbiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpXG5kZXYub2ZmKClcbmBgYFxuYGBgIn0= -->

```r
```r
pdf(\results/Div-seq/Divseq_results/predCellType_abundance_celltype.pdf\, height = 9.5, width = 7.5)
ggplot(tab_ctall, aes(x = Freq, y = Var2, fill = Var2))+
  facet_grid(majorct~Var1, scales = \free\, space = \free_y\)+
  geom_col()+
  scale_x_continuous(expand = c(0,0))+
  scale_fill_manual(values = cols_cc)+
  theme_bw()+
  theme(axis.text.x = element_text(size = 6, colour = \black\),
        axis.text.y = element_text(size = 6.5, colour = \black\),
        strip.text = element_text(size = 6.5),
        legend.position = \none\)
dev.off()

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

null device 1




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



## UMAPs
UMAP with predicted cell types


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9kZiA9IG1ldGFfZGl2X3ByZWRbLGMoMSw0LDUpXVxucGxvdF9kZiRzYW1wbGVbcGxvdF9kZiRzYW1wbGU9PVwiMV93cGlfcG9zXCJdID0gXCIxX3dwaVwiXG5wbG90X2RmJHNhbXBsZSA9IGZhY3RvcihwbG90X2RmJHNhbXBsZSwgbGV2ZWxzID0gcmV2KHBhc3RlMChjKDEsMiw0LDYsOCwxMiksIFwiX3dwaVwiKSkpXG5wbG90X2RmJHByZWRfcmVncyA9IGZhY3RvcihwbG90X2RmJHByZWRfcmVncywgbGV2ZWxzID0gYyhcIm1lZGlhbFwiLCBcImRvcnNhbFwiLCBcImxhdGVyYWxcIikpXG5mb3IoaSBpbiBjKFwiZ2x1dF9cIiwgXCJucGNfXCIpKXtcbiAgc3ViX3Bsb3RfZGYgPSBwbG90X2RmW2dyZXBsKGksIHBsb3RfZGYkcHJlZF9jdGFsbCksXVxuICBzdWJfcGxvdF9kZiRwcmVkX2N0YWxsID0gZ3N1YihwYXN0ZTAoaSwgXCJTVUJTRVRfXCIpLCBcIlwiLCBzdWJfcGxvdF9kZiRwcmVkX2N0YWxsKVxuICBsdmxzID0gaWYoaT09XCJnbHV0X1wiKXtcbiAgICBjKDksMTAsMjIsMjcsMTksMTQsMTcsMjYsOCw2LDIwLDEsMTEsMTMsMjUsMiwyMSwxNiwzLDAsMTIsNyw1LDQsMjQsMTUsMTgpXG4gIH0gZWxzZSB7YygyLDEzLDAsMTQsMSwzLDksNCwxMSw3KX1cbiAgc3ViX3Bsb3RfZGYgPSBzdWJfcGxvdF9kZltzdWJfcGxvdF9kZiRwcmVkX2N0YWxsICVpbiUgYXMuY2hhcmFjdGVyKGx2bHMpLF1cbiAgc3ViX3Bsb3RfZGYkcHJlZF9jdGFsbCA9IGZhY3RvcihzdWJfcGxvdF9kZiRwcmVkX2N0YWxsLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBhcy5jaGFyYWN0ZXIobHZscykpXG4gIGxpbW1heCA9IG1heCh0YWJsZShzdWJfcGxvdF9kZiRwcmVkX2N0YWxsKSlcbiAgXG4gIGZvcihnZyBpbiBjKFwic2FtcGxlXCIsIFwicHJlZF9yZWdzXCIsIFwiZ3JleTI1XCIpKXtcbiAgICBjb2xzX3VzZSA9IGlmKGdnPT1cInByZWRfcmVnc1wiKXtcbiAgICAgIHJlZ19jb2xzX3NpbXBcbiAgICB9IGVsc2UgaWYoZ2c9PVwic2FtcGxlXCIpe1xuICAgICAgcmV2KGNvbG9yUmFtcFBhbGV0dGUoYyhcImdyZXk4NVwiLCBcIiNkZjE2ZGZcIikpKDYpKVxuICAgIH1cbiAgICBwbHQgPSBnZ3Bsb3Qoc3ViX3Bsb3RfZGYpK1xuICAgICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLCBsaW1tYXgrMC4wNSpsaW1tYXgpKStcbiAgICAgIHRoZW1lX2NsYXNzaWMoKStcbiAgICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IFwiYmxhY2tcIiwgc2l6ZSA9IDcpLFxuICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3VyID0gXCJibGFja1wiLCBzaXplID0gNiksXG4gICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksXG4gICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLFxuICAgICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjQsIFwiY21cIiksXG4gICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksXG4gICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKVxuICAgIGlmKGdnIT1cImdyZXkyNVwiKXtcbiAgICAgIHBsdCA9IHBsdCtnZW9tX2JhcihtYXBwaW5nID0gYWVzX3N0cmluZyh4ID0gXCJwcmVkX2N0YWxsXCIsIGZpbGwgPSBnZykpK1xuICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xzX3VzZSlcbiAgICB9IGVsc2V7XG4gICAgICBwbHQgPSBwbHQrZ2VvbV9iYXIobWFwcGluZyA9IGFlc19zdHJpbmcoeCA9IFwicHJlZF9jdGFsbFwiKSwgZmlsbCA9IGdnKVxuICAgIH1cbiAgICBwZGYocGFzdGUwKFwicmVzdWx0cy9EaXYtc2VxL2JhcnBsb3RzX2dsdXRucGMvYmFyX1wiLCBpLCBnZywgXCIucGRmXCIpLCB3aWR0aCA9IDQuOCwgaGVpZ2h0ID0gMS4yNSlcbiAgICBwcmludChwbHQpXG4gICAgZGV2Lm9mZigpXG4gIH1cbn1cbmBgYCJ9 -->

```r
plot_df = meta_div_pred[,c(1,4,5)]
plot_df$sample[plot_df$sample=="1_wpi_pos"] = "1_wpi"
plot_df$sample = factor(plot_df$sample, levels = rev(paste0(c(1,2,4,6,8,12), "_wpi")))
plot_df$pred_regs = factor(plot_df$pred_regs, levels = c("medial", "dorsal", "lateral"))
for(i in c("glut_", "npc_")){
  sub_plot_df = plot_df[grepl(i, plot_df$pred_ctall),]
  sub_plot_df$pred_ctall = gsub(paste0(i, "SUBSET_"), "", sub_plot_df$pred_ctall)
  lvls = if(i=="glut_"){
    c(9,10,22,27,19,14,17,26,8,6,20,1,11,13,25,2,21,16,3,0,12,7,5,4,24,15,18)
  } else {c(2,13,0,14,1,3,9,4,11,7)}
  sub_plot_df = sub_plot_df[sub_plot_df$pred_ctall %in% as.character(lvls),]
  sub_plot_df$pred_ctall = factor(sub_plot_df$pred_ctall, 
                                  levels = as.character(lvls))
  limmax = max(table(sub_plot_df$pred_ctall))
  
  for(gg in c("sample", "pred_regs", "grey25")){
    cols_use = if(gg=="pred_regs"){
      reg_cols_simp
    } else if(gg=="sample"){
      rev(colorRampPalette(c("grey85", "#df16df"))(6))
    }
    plt = ggplot(sub_plot_df)+
      scale_y_continuous(expand = c(0,0), limits = c(0, limmax+0.05*limmax))+
      theme_classic()+
      theme(axis.text.x = element_text(colour = "black", size = 7),
            axis.text.y = element_text(colour = "black", size = 6),
            axis.title.x = element_blank(),
            axis.title.y = element_text(size = 7),
            legend.key.size = unit(0.4, "cm"),
            legend.text = element_text(size = 6),
            legend.title = element_text(size = 7))
    if(gg!="grey25"){
      plt = plt+geom_bar(mapping = aes_string(x = "pred_ctall", fill = gg))+
        scale_fill_manual(values = cols_use)
    } else{
      plt = plt+geom_bar(mapping = aes_string(x = "pred_ctall"), fill = gg)
    }
    pdf(paste0("results/Div-seq/barplots_glutnpc/bar_", i, gg, ".pdf"), width = 4.8, height = 1.25)
    print(plt)
    dev.off()
  }
}

Line plot

Line plot for major cell types

```r
tab_ctall = data.frame(table(meta_div_pred$sample, 
                             paste0(meta_div_pred$pred_ctall, \..\, meta_div_pred$pred_regs)))
tab_ctall$ct = unlist(lapply(strsplit(as.character(tab_ctall$Var2), \..\, fixed = T), 
                             function(x) x[1]))
tab_ctall$reg = unlist(lapply(strsplit(as.character(tab_ctall$Var2), \..\, fixed = T), 
                              function(x) x[2]))
tab_ctall$majorct = unlist(lapply(strsplit(as.character(tab_ctall$Var2), \_\), function(x) x[1]))
tab_ctall$majorct = factor(tab_ctall$majorct, 
                           levels = c(\epen\, \npc\, \glut\, \GABA\, \microglia\,
                                      \oligodendrocyte\, \endothelial\))

ctord = sort(table(meta_div_pred$pred_ctall))
tab_ctall$ct = factor(tab_ctall$ct, levels = names(ctord))

pdf(\results/Div-seq/Divseq_results/predCellType_abundance_predRegion.pdf\, height = 9.5, width = 7.5)
ggplot(tab_ctall, aes(x = Freq, y = ct, fill = reg))+
  facet_grid(majorct~Var1, scales = \free\, space = \free_y\)+
  geom_col()+
  scale_x_continuous(expand = c(0,0))+
  scale_fill_manual(values = reg_cols_simp)+
  theme_bw()+
  theme(axis.text.x = element_text(size = 6, colour = \black\),
        axis.text.y = element_text(size = 6.5, colour = \black\),
        strip.text = element_text(size = 6.5),
        legend.position = \none\)
dev.off()

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

null device 1




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




# Integrating SS and 1 wpi neg
Load data


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubWFqb3JjdCA9IHNhcHBseShzdHJzcGxpdChtZXRhX2Rpdl9wcmVkJHByZWRfY3RhbGwsIFwiX1wiKSwgZnVuY3Rpb24oeCkgeFsxXSlcbm1ham9yY3RbbWV0YV9kaXZfcHJlZCRwcmVkX2N0YWxsICVpbiUgYyhcImVwZW5fY2x1c180XCIsIFwiZXBlbl9jbHVzXzNcIildID0gXCJlcGVuX2FcIlxubWFqb3JjdFttZXRhX2Rpdl9wcmVkJHByZWRfY3RhbGwgJWluJSBjKFwiZXBlbl9jbHVzXzFcIiwgXCJlcGVuX2NsdXNfMTNcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlcGVuX2NsdXNfN1wiLFwiZXBlbl9jbHVzXzE0XCIpXSA9IFwiZXBlbl9uXCJcbnBsb3RfZGYgPSByZXNoYXBlMjo6bWVsdChwcm9wLnRhYmxlKHRhYmxlKG1ham9yY3QsIG1ldGFfZGl2X3ByZWQkc2FtcGxlKSwgbWFyZ2luID0gMikpXG5wbG90X2RmJFZhcjIgPSBhcy5jaGFyYWN0ZXIocGxvdF9kZiRWYXIyKVxucGxvdF9kZiRWYXIyW3Bsb3RfZGYkVmFyMj09XCIxX3dwaV9wb3NcIl0gPSBcIjFfd3BpXCJcbnBsb3RfZGYkVmFyMiA9IGZhY3RvcihwbG90X2RmJFZhcjIsIGxldmVscyA9IGMoXCIxX3dwaVwiLCBcIjJfd3BpXCIsIFwiNF93cGlcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiNl93cGlcIiwgXCI4X3dwaVwiLCBcIjEyX3dwaVwiKSlcblxuY29sc191c2UgPSBjKHVubmFtZShjb2xzX2NjW2dyZXBsKFwiZXBlblwiLCBuYW1lcyhjb2xzX2NjKSldW2MoMSwxNSw4KV0pLCBcIiM2MDkxYmFcIiwgXCIjZDA1OTU5XCIsXG4gICAgICAgICAgICAgXCIjZmViNzJhXCIsIFwiI0U2NTMwRFwiLCBcIiNFNDNEODhcIiwgXCIjNzEyMTY2XCIpXG5uYW1lcyhjb2xzX3VzZSkgPSBjKFwiZXBlbl9hXCIsIFwiZXBlbl9uXCIsIFwiZXBlbl9xXCIsIFwiZ2x1dFwiLCBcIkdBQkFcIiwgXCJucGNcIiwgXG4gICAgICAgICAgICAgICAgICAgIFwibWljcm9nbGlhXCIsIFwib2xpZ29kZW5kcm9jeXRlXCIsIFwiZW5kb3RoZWxpYWxcIilcbmxuX3BsdCA9IGdncGxvdChwbG90X2RmLCBhZXMoeCA9IFZhcjIsIHkgPSB2YWx1ZSwgXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwID0gbWFqb3JjdCwgY29sb3VyID0gbWFqb3JjdCkpK1xuICBnZW9tX3BvaW50KHNpemUgPSAxKStcbiAgZ2VvbV9saW5lKCkrXG4gIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29sc191c2UpK1xuICBsYWJzKHggPSBcInRpbWUgKHdwaSlcIiwgeSA9IFwicHJvcG9ydGlvbiBwZXIgdGltZXBvaW50XCIsXG4gICAgICAgY29sb3VyID0gXCJtYWpvciBjZWxsIHR5cGVcXG4ocHJlZGljdGVkKVwiKStcbiAgdGhlbWVfY2xhc3NpYygpK1xuICB0aGVtZShhc3BlY3QucmF0aW8gPSAxLzIsXG4gICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgY29sb3VyID0gXCJibGFja1wiKSxcbiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNy41KSxcbiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLFxuICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcuNSksXG4gICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC41NSwgXCJjbVwiKSlcblxucGRmKFwicmVzdWx0cy9EaXYtc2VxL0RpdnNlcV9yZXN1bHRzL2RpdnNlcV9tYWpvcmN0X2xpbmVzLnBkZlwiLCBoZWlnaHQgPSAzLCB3aWR0aCA9IDUpXG5wcmludChsbl9wbHQpXG5kZXYub2ZmKClcbmBgYCJ9 -->

```r
majorct = sapply(strsplit(meta_div_pred$pred_ctall, "_"), function(x) x[1])
majorct[meta_div_pred$pred_ctall %in% c("epen_clus_4", "epen_clus_3")] = "epen_a"
majorct[meta_div_pred$pred_ctall %in% c("epen_clus_1", "epen_clus_13", 
                                        "epen_clus_7","epen_clus_14")] = "epen_n"
plot_df = reshape2::melt(prop.table(table(majorct, meta_div_pred$sample), margin = 2))
plot_df$Var2 = as.character(plot_df$Var2)
plot_df$Var2[plot_df$Var2=="1_wpi_pos"] = "1_wpi"
plot_df$Var2 = factor(plot_df$Var2, levels = c("1_wpi", "2_wpi", "4_wpi", 
                                               "6_wpi", "8_wpi", "12_wpi"))

cols_use = c(unname(cols_cc[grepl("epen", names(cols_cc))][c(1,15,8)]), "#6091ba", "#d05959",
             "#feb72a", "#E6530D", "#E43D88", "#712166")
names(cols_use) = c("epen_a", "epen_n", "epen_q", "glut", "GABA", "npc", 
                    "microglia", "oligodendrocyte", "endothelial")
ln_plt = ggplot(plot_df, aes(x = Var2, y = value, 
                    group = majorct, colour = majorct))+
  geom_point(size = 1)+
  geom_line()+
  scale_colour_manual(values = cols_use)+
  labs(x = "time (wpi)", y = "proportion per timepoint",
       colour = "major cell type\n(predicted)")+
  theme_classic()+
  theme(aspect.ratio = 1/2,
        axis.text = element_text(size = 7, colour = "black"),
        axis.title = element_text(size = 7.5),
        legend.text = element_text(size = 7),
        legend.title = element_text(size = 7.5),
        legend.key.size = unit(0.55, "cm"))

pdf("results/Div-seq/Divseq_results/divseq_majorct_lines.pdf", height = 3, width = 5)
print(ln_plt)
dev.off()
null device 
          1 

Merge datasets

ax_srat = readRDS("data/expression/axolotl_reclust/all_nuclei_clustered_highlevel_anno.RDS")
meta = read.csv("data/annotations/axolotl_all_umeta.csv", 
                header = T, row.names = 1)
ax_srat = AddMetaData(ax_srat, metadata = meta)
meta_regs = read.csv("data/processed/multiome/WP_region_predictions.csv", 
                    header = T, row.names = 1)
newcellnames = rownames(meta_regs)
newcellnames = gsub("-a1-1", "-1_1", newcellnames)
newcellnames = gsub("-a1-2", "-1_2", newcellnames)
newcellnames = gsub("-a3-1", "-1_3", newcellnames)
newcellnames = gsub("-a3-2", "-1_4", newcellnames)
rownames(meta_regs) = newcellnames
ax_srat = AddMetaData(ax_srat, metadata = meta_regs)
ax_srat$regions_all = ax_srat$pred_regions_top
ax_srat$regions_all[is.na(ax_srat$regions_all)] = ax_srat$regions[is.na(ax_srat$regions_all)]

neg_srat = readRDS("data/expression/axolotl_reclust/divseq_1wpi_neg.RDS")
reg_pred = read.csv("results/Div-seq/preds_lr_regions_neg_all.csv", header = T, row.names = 1)
ct_pred = read.csv("results/Div-seq/preds_rfc_CT_neg_all.csv", header = T, row.names = 1)

neg_srat$pred_regs = reg_pred[colnames(neg_srat),"pred_lr"]
neg_srat$pred_ctall = ct_pred[colnames(neg_srat),"pred_rfc"]

Joint processing

# filter metadata
ax_srat@meta.data = ax_srat@meta.data[,c("nCount_RNA", "nFeature_RNA", "percent.mt", "chem", "high_level_anno", "cellclusters", "regions_all")]
colnames(ax_srat@meta.data)[4] = "sample"
neg_srat@meta.data = neg_srat@meta.data[,c("nCount_RNA", "nFeature_RNA", "percent.mt", "sample", "seurat_clusters", "pred_ctall", "pred_regs"), drop = F]

ax_neg_srat = merge(ax_srat, neg_srat)

Run UMAP

ax_neg_srat$sample_dat = ax_neg_srat$sample
ax_neg_srat$sample_dat[grepl("wpi", ax_neg_srat$sample_dat)] = "div"
ax_neg_srat = NormalizeData(ax_neg_srat)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
ax_neg_srat = FindVariableFeatures(ax_neg_srat, nfeatures = 10000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
ax_neg_srat = ScaleData(ax_neg_srat, vars.to.regress = c("nCount_RNA", "percent.mt", "sample_dat"))
Regressing out nCount_RNA, percent.mt, sample_dat

  |                                                                                             
  |                                                                                       |   0%
  |                                                                                             
  |                                                                                       |   1%
  |                                                                                             
  |=                                                                                      |   1%
  |                                                                                             
  |=                                                                                      |   2%
  |                                                                                             
  |==                                                                                     |   2%
  |                                                                                             
  |==                                                                                     |   3%
  |                                                                                             
  |===                                                                                    |   3%
  |                                                                                             
  |===                                                                                    |   4%
  |                                                                                             
  |====                                                                                   |   4%
  |                                                                                             
  |====                                                                                   |   5%
  |                                                                                             
  |=====                                                                                  |   5%
  |                                                                                             
  |=====                                                                                  |   6%
  |                                                                                             
  |======                                                                                 |   6%
  |                                                                                             
  |======                                                                                 |   7%
  |                                                                                             
  |=======                                                                                |   7%
  |                                                                                             
  |=======                                                                                |   8%
  |                                                                                             
  |=======                                                                                |   9%
  |                                                                                             
  |========                                                                               |   9%
  |                                                                                             
  |========                                                                               |  10%
  |                                                                                             
  |=========                                                                              |  10%
  |                                                                                             
  |=========                                                                              |  11%
  |                                                                                             
  |==========                                                                             |  11%
  |                                                                                             
  |==========                                                                             |  12%
  |                                                                                             
  |===========                                                                            |  12%
  |                                                                                             
  |===========                                                                            |  13%
  |                                                                                             
  |============                                                                           |  13%
  |                                                                                             
  |============                                                                           |  14%
  |                                                                                             
  |=============                                                                          |  14%
  |                                                                                             
  |=============                                                                          |  15%
  |                                                                                             
  |=============                                                                          |  16%
  |                                                                                             
  |==============                                                                         |  16%
  |                                                                                             
  |==============                                                                         |  17%
  |                                                                                             
  |===============                                                                        |  17%
  |                                                                                             
  |===============                                                                        |  18%
  |                                                                                             
  |================                                                                       |  18%
  |                                                                                             
  |================                                                                       |  19%
  |                                                                                             
  |=================                                                                      |  19%
  |                                                                                             
  |=================                                                                      |  20%
  |                                                                                             
  |==================                                                                     |  20%
  |                                                                                             
  |==================                                                                     |  21%
  |                                                                                             
  |===================                                                                    |  21%
  |                                                                                             
  |===================                                                                    |  22%
  |                                                                                             
  |====================                                                                   |  22%
  |                                                                                             
  |====================                                                                   |  23%
  |                                                                                             
  |====================                                                                   |  24%
  |                                                                                             
  |=====================                                                                  |  24%
  |                                                                                             
  |=====================                                                                  |  25%
  |                                                                                             
  |======================                                                                 |  25%
  |                                                                                             
  |======================                                                                 |  26%
  |                                                                                             
  |=======================                                                                |  26%
  |                                                                                             
  |=======================                                                                |  27%
  |                                                                                             
  |========================                                                               |  27%
  |                                                                                             
  |========================                                                               |  28%
  |                                                                                             
  |=========================                                                              |  28%
  |                                                                                             
  |=========================                                                              |  29%
  |                                                                                             
  |==========================                                                             |  29%
  |                                                                                             
  |==========================                                                             |  30%
  |                                                                                             
  |===========================                                                            |  30%
  |                                                                                             
  |===========================                                                            |  31%
  |                                                                                             
  |===========================                                                            |  32%
  |                                                                                             
  |============================                                                           |  32%
  |                                                                                             
  |============================                                                           |  33%
  |                                                                                             
  |=============================                                                          |  33%
  |                                                                                             
  |=============================                                                          |  34%
  |                                                                                             
  |==============================                                                         |  34%
  |                                                                                             
  |==============================                                                         |  35%
  |                                                                                             
  |===============================                                                        |  35%
  |                                                                                             
  |===============================                                                        |  36%
  |                                                                                             
  |================================                                                       |  36%
  |                                                                                             
  |================================                                                       |  37%
  |                                                                                             
  |=================================                                                      |  37%
  |                                                                                             
  |=================================                                                      |  38%
  |                                                                                             
  |==================================                                                     |  39%
  |                                                                                             
  |==================================                                                     |  40%
  |                                                                                             
  |===================================                                                    |  40%
  |                                                                                             
  |===================================                                                    |  41%
  |                                                                                             
  |====================================                                                   |  41%
  |                                                                                             
  |====================================                                                   |  42%
  |                                                                                             
  |=====================================                                                  |  42%
  |                                                                                             
  |=====================================                                                  |  43%
  |                                                                                             
  |======================================                                                 |  43%
  |                                                                                             
  |======================================                                                 |  44%
  |                                                                                             
  |=======================================                                                |  44%
  |                                                                                             
  |=======================================                                                |  45%
  |                                                                                             
  |========================================                                               |  45%
  |                                                                                             
  |========================================                                               |  46%
  |                                                                                             
  |========================================                                               |  47%
  |                                                                                             
  |=========================================                                              |  47%
  |                                                                                             
  |=========================================                                              |  48%
  |                                                                                             
  |==========================================                                             |  48%
  |                                                                                             
  |==========================================                                             |  49%
  |                                                                                             
  |===========================================                                            |  49%
  |                                                                                             
  |===========================================                                            |  50%
  |                                                                                             
  |============================================                                           |  50%
  |                                                                                             
  |============================================                                           |  51%
  |                                                                                             
  |=============================================                                          |  51%
  |                                                                                             
  |=============================================                                          |  52%
  |                                                                                             
  |==============================================                                         |  52%
  |                                                                                             
  |==============================================                                         |  53%
  |                                                                                             
  |===============================================                                        |  53%
  |                                                                                             
  |===============================================                                        |  54%
  |                                                                                             
  |===============================================                                        |  55%
  |                                                                                             
  |================================================                                       |  55%
  |                                                                                             
  |================================================                                       |  56%
  |                                                                                             
  |=================================================                                      |  56%
  |                                                                                             
  |=================================================                                      |  57%
  |                                                                                             
  |==================================================                                     |  57%
  |                                                                                             
  |==================================================                                     |  58%
  |                                                                                             
  |===================================================                                    |  58%
  |                                                                                             
  |===================================================                                    |  59%
  |                                                                                             
  |====================================================                                   |  59%
  |                                                                                             
  |====================================================                                   |  60%
  |                                                                                             
  |=====================================================                                  |  60%
  |                                                                                             
  |=====================================================                                  |  61%
  |                                                                                             
  |======================================================                                 |  62%
  |                                                                                             
  |======================================================                                 |  63%
  |                                                                                             
  |=======================================================                                |  63%
  |                                                                                             
  |=======================================================                                |  64%
  |                                                                                             
  |========================================================                               |  64%
  |                                                                                             
  |========================================================                               |  65%
  |                                                                                             
  |=========================================================                              |  65%
  |                                                                                             
  |=========================================================                              |  66%
  |                                                                                             
  |==========================================================                             |  66%
  |                                                                                             
  |==========================================================                             |  67%
  |                                                                                             
  |===========================================================                            |  67%
  |                                                                                             
  |===========================================================                            |  68%
  |                                                                                             
  |============================================================                           |  68%
  |                                                                                             
  |============================================================                           |  69%
  |                                                                                             
  |============================================================                           |  70%
  |                                                                                             
  |=============================================================                          |  70%
  |                                                                                             
  |=============================================================                          |  71%
  |                                                                                             
  |==============================================================                         |  71%
  |                                                                                             
  |==============================================================                         |  72%
  |                                                                                             
  |===============================================================                        |  72%
  |                                                                                             
  |===============================================================                        |  73%
  |                                                                                             
  |================================================================                       |  73%
  |                                                                                             
  |================================================================                       |  74%
  |                                                                                             
  |=================================================================                      |  74%
  |                                                                                             
  |=================================================================                      |  75%
  |                                                                                             
  |==================================================================                     |  75%
  |                                                                                             
  |==================================================================                     |  76%
  |                                                                                             
  |===================================================================                    |  76%
  |                                                                                             
  |===================================================================                    |  77%
  |                                                                                             
  |===================================================================                    |  78%
  |                                                                                             
  |====================================================================                   |  78%
  |                                                                                             
  |====================================================================                   |  79%
  |                                                                                             
  |=====================================================================                  |  79%
  |                                                                                             
  |=====================================================================                  |  80%
  |                                                                                             
  |======================================================================                 |  80%
  |                                                                                             
  |======================================================================                 |  81%
  |                                                                                             
  |=======================================================================                |  81%
  |                                                                                             
  |=======================================================================                |  82%
  |                                                                                             
  |========================================================================               |  82%
  |                                                                                             
  |========================================================================               |  83%
  |                                                                                             
  |=========================================================================              |  83%
  |                                                                                             
  |=========================================================================              |  84%
  |                                                                                             
  |==========================================================================             |  84%
  |                                                                                             
  |==========================================================================             |  85%
  |                                                                                             
  |==========================================================================             |  86%
  |                                                                                             
  |===========================================================================            |  86%
  |                                                                                             
  |===========================================================================            |  87%
  |                                                                                             
  |============================================================================           |  87%
  |                                                                                             
  |============================================================================           |  88%
  |                                                                                             
  |=============================================================================          |  88%
  |                                                                                             
  |=============================================================================          |  89%
  |                                                                                             
  |==============================================================================         |  89%
  |                                                                                             
  |==============================================================================         |  90%
  |                                                                                             
  |===============================================================================        |  90%
  |                                                                                             
  |===============================================================================        |  91%
  |                                                                                             
  |================================================================================       |  91%
  |                                                                                             
  |================================================================================       |  92%
  |                                                                                             
  |================================================================================       |  93%
  |                                                                                             
  |=================================================================================      |  93%
  |                                                                                             
  |=================================================================================      |  94%
  |                                                                                             
  |==================================================================================     |  94%
  |                                                                                             
  |==================================================================================     |  95%
  |                                                                                             
  |===================================================================================    |  95%
  |                                                                                             
  |===================================================================================    |  96%
  |                                                                                             
  |====================================================================================   |  96%
  |                                                                                             
  |====================================================================================   |  97%
  |                                                                                             
  |=====================================================================================  |  97%
  |                                                                                             
  |=====================================================================================  |  98%
  |                                                                                             
  |====================================================================================== |  98%
  |                                                                                             
  |====================================================================================== |  99%
  |                                                                                             
  |=======================================================================================|  99%
  |                                                                                             
  |=======================================================================================| 100%
Centering and scaling data matrix

  |                                                                                             
  |                                                                                       |   0%
  |                                                                                             
  |=========                                                                              |  10%
  |                                                                                             
  |=================                                                                      |  20%
  |                                                                                             
  |==========================                                                             |  30%
  |                                                                                             
  |===================================                                                    |  40%
  |                                                                                             
  |============================================                                           |  50%
  |                                                                                             
  |====================================================                                   |  60%
  |                                                                                             
  |=============================================================                          |  70%
  |                                                                                             
  |======================================================================                 |  80%
  |                                                                                             
  |==============================================================================         |  90%
  |                                                                                             
  |=======================================================================================| 100%
ax_neg_srat = RunPCA(ax_neg_srat, verbose = F)
ElbowPlot(ax_neg_srat, ndims = 50)

Integrate with Harmony based on multiome/v3.1/div-seq

ax_neg_srat = RunUMAP(ax_neg_srat, dims = 1:20, verbose = F)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
UMAPPlot(ax_neg_srat, group.by = "sample_dat")

UMAPPlot(ax_neg_srat, group.by = "cellclusters")

Check integration

ax_neg_srat$sample_simp = ax_neg_srat$sample
ax_neg_srat$sample_simp[ax_neg_srat$sample_simp!="1_wpi_neg"] = "SS"
ax_neg_srat$ctlabels = ax_neg_srat$cellclusters
ax_neg_srat$ctlabels[is.na(ax_neg_srat$ctlabels)] = ax_neg_srat$pred_ctall[is.na(ax_neg_srat$ctlabels)]
ax_neg_srat$reglabels = ax_neg_srat$regions_all
ax_neg_srat$reglabels[is.na(ax_neg_srat$reglabels)] = ax_neg_srat$pred_regs[is.na(ax_neg_srat$reglabels)]
DimPlot(ax_neg_srat, group.by = "sample_dat", reduction = "umap_harmony")
DimPlot(ax_neg_srat, group.by = "ctlabels", reduction = "umap_harmony")
plt1 = DimPlot(ax_neg_srat, group.by = "ctlabels", reduction = "umap_harmony", 
               label = T, split.by = "sample_dat")
plt2 = DimPlot(ax_neg_srat, group.by = "ctlabels", reduction = "umap_harmony", 
               label = T, split.by = "sample")
plt3 = DimPlot(ax_neg_srat, group.by = "sample_dat", reduction = "umap_harmony", label = T)
plt4 = DimPlot(ax_neg_srat, group.by = "reglabels", reduction = "umap_harmony", label = T)
plt5 = DimPlot(ax_neg_srat, group.by = "ctlabels", reduction = "umap_harmony", 
               label = T, split.by = "reglabels")

DimPlot(ax_neg_srat, group.by = "ctlabels", reduction = "umap_harmony", 
        label = T, split.by = "sample_simp")+NoLegend()
DimPlot(ax_neg_srat, group.by = "sample_simp", reduction = "umap_harmony")

Clustering

DE between protocols

Filter the DE genes to those significant and meaningful

ct_mk_l_filt = list()
for(n in names(ct_mk_l)){
  ct_mk_l_filt[[n]] = ct_mk_l[[n]][ct_mk_l[[n]]$padj<=0.05 & ct_mk_l[[n]]$logFC>=0.3,]
  ct_mk_l_filt[[n]] = ct_mk_l_filt[[n]][!startsWith(ct_mk_l_filt[[n]]$feature, "AMEX") &
                                        !startsWith(ct_mk_l_filt[[n]]$feature, "LOC") &
                                        !grepl("..", ct_mk_l_filt[[n]]$feature, fixed = T),]
}

cl_mk_l_filt = list()
for(n in names(cl_mk_l)){
  cl_mk_l_filt[[n]] = cl_mk_l[[n]][cl_mk_l[[n]]$padj<=0.05 & cl_mk_l[[n]]$logFC>=0.3,]
  cl_mk_l_filt[[n]] = cl_mk_l_filt[[n]][!startsWith(cl_mk_l_filt[[n]]$feature, "AMEX") &
                                      !startsWith(cl_mk_l_filt[[n]]$feature, "LOC") &
                                      !grepl("..", cl_mk_l_filt[[n]]$feature, fixed = T),]
}

Count DE genes per cell type and condition

ct_mk_l_filt = list()
for(n in names(ct_mk_l)){
  ct_mk_l_filt[[n]] = ct_mk_l[[n]][ct_mk_l[[n]]$padj<=0.05 & ct_mk_l[[n]]$logFC>=0.3,]
  ct_mk_l_filt[[n]] = ct_mk_l_filt[[n]][!startsWith(ct_mk_l_filt[[n]]$feature, "AMEX") &
                                        !startsWith(ct_mk_l_filt[[n]]$feature, "LOC") &
                                        !grepl("..", ct_mk_l_filt[[n]]$feature, fixed = T),]
}

cl_mk_l_filt = list()
for(n in names(cl_mk_l)){
  cl_mk_l_filt[[n]] = cl_mk_l[[n]][cl_mk_l[[n]]$padj<=0.05 & cl_mk_l[[n]]$logFC>=0.3,]
  cl_mk_l_filt[[n]] = cl_mk_l_filt[[n]][!startsWith(cl_mk_l_filt[[n]]$feature, "AMEX") &
                                      !startsWith(cl_mk_l_filt[[n]]$feature, "LOC") &
                                      !grepl("..", cl_mk_l_filt[[n]]$feature, fixed = T),]
}

Get GO Terms, without repeated genes

n_de = matrix(0, ncol = 2, nrow = length(ct_mk_l_filt))
colnames(n_de) = c("SS", "1_wpi_neg")
rownames(n_de) = names(ct_mk_l_filt)
for(n in names(ct_mk_l_filt)){
  tab = table(ct_mk_l_filt[[n]]$group)
  n_de[n, "SS"] = tab["SS"]
  n_de[n, "1_wpi_neg"] = tab["1_wpi_neg"]
}
n_de[is.na(n_de)] = 0

n_de_cl = matrix(0, ncol = 2, nrow = length(cl_mk_l_filt))
colnames(n_de_cl) = c("SS", "1_wpi_neg")
rownames(n_de_cl) = names(cl_mk_l_filt)
for(n in names(cl_mk_l_filt)){
  tab = table(cl_mk_l_filt[[n]]$group)
  n_de_cl[n, "SS"] = tab["SS"]
  n_de_cl[n, "1_wpi_neg"] = tab["1_wpi_neg"]
}
n_de_cl[is.na(n_de_cl)] = 0

Compare clusters and conditions and cell types

df_ctcl = data.frame(table(ax_neg_srat$ctlabels, ax_neg_srat$integNeg_res.10))
pheatmap::pheatmap(table(ax_neg_srat$ctlabels, ax_neg_srat$integNeg_res.10), 
                   fontsize = 6.5, clustering_method = "ward.D", scale = "row")

df_clct = data.frame(table(ax_neg_srat$integNeg_res.10, ax_neg_srat$sample_simp))
tab_s = prop.table(table(ax_neg_srat$integNeg_res.10, ax_neg_srat$sample_simp), margin = 2)
pheatmap::pheatmap(tab_s, fontsize = 6.5, clustering_method = "ward.D")
pheatmap::pheatmap(tab_s[tab_s[,1]>tab_s[,2]*1.1,], fontsize = 6.5, clustering_method = "ward.D")

Count number of DE genes - plot

Save data

plot_df = reshape2::melt(n_de)
ord = rowSums(n_de)
plot_df$Var1 = factor(plot_df$Var1, levels = rownames(n_de)[order(ord, decreasing = T)])

ggplot(plot_df, aes(x = Var1, y = value, fill = Var2))+
  geom_col()+
  scale_y_continuous(expand = c(0,0), limits = c(0, max(ord)+max(ord)*0.05))+
  labs(x = "Cell Types", y = "# DE genes")+
  theme_bw()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))

LS0tCnRpdGxlOiAiRGl2LXNlcSBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCgojIEdlbmVyYWwgU2V0dXAKU2V0dXAgY2h1bmsKCmBgYHtyLCBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDgpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gbm9ybWFsaXplUGF0aCgiLi4iKSkKa25pdHI6Om9wdHNfa25pdCRnZXQoInJvb3QuZGlyIikKYGBgCgpTZXR1cCByZXRpY3VsYXRlCgpgYGB7cn0KbGlicmFyeShyZXRpY3VsYXRlKQprbml0cjo6a25pdF9lbmdpbmVzJHNldChweXRob24gPSByZXRpY3VsYXRlOjplbmdfcHl0aG9uKQpweV9hdmFpbGFibGUoaW5pdGlhbGl6ZSA9IEZBTFNFKQp1c2VfcHl0aG9uKFN5cy53aGljaCgicHl0aG9uIikpCnB5X2NvbmZpZygpCmBgYAoKTG9hZCBsaWJyYXJpZXMKCmBgYHtyfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGFyYWxsZWwpCmxpYnJhcnkoZG9QYXJhbGxlbCkKbGlicmFyeShmb3JlYWNoKQpsaWJyYXJ5KGdnZGVuZHJvKQpsaWJyYXJ5KHByZXN0bykKbGlicmFyeShzY2F0dGVycGllKQpgYGAKClNldCBjb2xvdXJzIGZvciBjZWxsIHR5cGVzIGFuZCByZWdpb25zCgpgYGB7cn0KbWV0YSA9IHJlYWQuY3N2KCJkYXRhL2Fubm90YXRpb25zL2F4b2xvdGxfYWxsX3VtZXRhLmNzdiIsIAogICAgICAgICAgICAgICAgaGVhZGVyID0gVCwgcm93Lm5hbWVzID0gMSkKY29sc19jYyA9IGMoCiNlcGVuCiIjMTI0MDBjIiwgIiMyZDY2MjQiLCIjMWQ0ZjE1IiwgIiMxNzQ3MTEiLCAiIzJkNjYyNCIsICIjM2Q3ZjMzIiwgIiMzYjdiMzAiLCAiIzQ2OGIzYiIsICIjNGY5ODQzIiwiIzVkYWU1MCIsICIjNjZiYjU4IiwgIiM3MmNkNjQiLCAiIzMwNmEyNiIsICIjNzhkNjY5IiwgIiM4MWU0NzIiLAojZ2FiYQoiIzcwMDIwOSIsICIjNzUwOTBlIiwiIzdhMGYxMyIsICIjODAxNTE3IiwgIiM4NTFhMWIiLCAiIzhhMWYxZiIsICIjOTAyNDIzIiwgIiM5NTI5MjciLCAiIzlhMmQyYyIsIiNhMDMyMzAiLCAiI2E1MzYzNCIsICIjYWEzYTM5IiwgIiNiMDNmM2QiLCIjYjU0MzQyIiwgIiNiYTQ4NDYiLCAiI2MwNGM0YiIsICIjYzU1MDRmIiwgIiNjYTU1NTQiLCAiI2QwNTk1OSIsICIjZDU1ZTVlIiwiIzczMDUwYyIsICIjNzgwYzExIiwiIzhkMjIyMSIsICIjOTgyYjJhIiwiI2EyMzQzMiIsICIjYTgzODM3IiwgIiNiMjQxM2YiLCAiI2I4NDU0NCIsICIjYmQ0YTQ5IiwgIiNjODUzNTIiLCAjIiNjZDU3NTYiLAojZ2x1dAoiIzA1NDY3NCIsICIjMTM0ZDdiIiwiIzFkNTQ4MSIsICIjMjY1YTg4IiwgIiMyZTYxOGUiLCAiIzczYTRjYiIsICIjMzY2OTk1IiwgIiMzZTcwOWMiLCAiIzQ2NzdhMiIsIiM0ZDdlYTkiLCAiIzU1ODZiMCIsICIjNWM4ZGI3IiwgIiM2NDk1YmQiLCIjNmI5Y2M0IiwgIiM3YmFjZDIiLCAiIzhlYmZlNCIsICIjOTZjN2ViIiwgIiM5ZWNmZjIiLCAiIzE4NTA3ZSIsICIjMTg1MDdlIiwiIzJhNWU4YiIsICIjNDk3YmE2IiwiIzU4ODliMyIsICIjNmZhMGM4IiwiIzdmYWZkNiIsICIjNjA5MWJhIiwgIiM1MTgyYWMiLCAiIzNhNmM5OCIsICIjYTZkN2Y5IiwKI25wYwoiI2ZmYjEyMCIsICIjZmViNzJhIiwiI2ZkYmMzNCIsICIjZmNjMTNkIiwgIiNmYmM3NDUiLCAiI2ZhY2M0ZSIsICIjZjlkMTU2IiwgIiNmOGQ2NWYiLCAiI2Y4ZGE2OCIsIiNmN2RmNzAiLCAiI2Y3ZTQ3OSIsICIjZjdlODgyIiwgIiNmN2VkOGEiLCAiI2Y3ZjE5MyIsICIjZWNhMzE5IgopCmNjbmFtZXMgPSB1bmlxdWUoc29ydChtZXRhJGNlbGxjbHVzdGVycykpCm5hbWVzKGNvbHNfY2MpID0gYyhjY25hbWVzW2dyZXBsKCJlcGVuIiwgY2NuYW1lcyldLCBjY25hbWVzW2dyZXBsKCJHQUJBIiwgY2NuYW1lcyldLGNjbmFtZXNbZ3JlcGwoImdsdXQiLCBjY25hbWVzKV0sY2NuYW1lc1tncmVwbCgibnBjIiwgY2NuYW1lcyldKQoKY29sc19jYyA9IGMoY29sc19jYywgIm1pY3JvZ2xpYV84IiA9ICIjRTY1MzBEIiwgCiAgICAgICAgICAgICJvbGlnb2RlbmRyb2N5dGVfMTUiID0gIiNFNDNEODgiLCAib2xpZ29kZW5kcm9jeXRlXzEwIiA9ICIjRjY2MkE1IiwKICAgICAgICAgICAgImVuZG90aGVsaWFsXzExIiA9ICIjNzEyMTY2IiwgImVuZG90aGVsaWFsXzEyIiA9ICIjQjAyNzlEIiwgCiAgICAgICAgICAgICJlbmRvdGhlbGlhbF8xNCIgPSAiI0JFNUFCMCIpCgpyZWdfY29scyA9IGMoIm90aGVyL3Vua25vd25fcHJlZCIgPSAiI0M3Q0NDNyIsIAogICAgICAgICAgICAgIm1lZGlhbCIgPSAiIzUyMTY4RCIsICJtZWRpYWxfcHJlZCIgPSAiIzY2MUNCMCIsIAogICAgICAgICAgICAgImRvcnNhbCIgPSAiI0M1NjAwNyIsICJkb3JzYWxfcHJlZCIgPSAiI0VENzMwNyIsIAogICAgICAgICAgICAgImxhdGVyYWwiID0gIiMxMTgzOTIiLCAibGF0ZXJhbF9wcmVkIiA9ICIjMTZBM0I2IikKcmVnX2NvbHNfc2ltcCA9IGMoIm1lZGlhbCIgPSAiIzUyMTY4RCIsICJkb3JzYWwiID0gIiNDNTYwMDciLCAibGF0ZXJhbCIgPSAiIzExODM5MiIpCmBgYAoKCgojIFByZXBhcmUgZGF0YQpMb2FkIERpdi1zZXEKCmBgYHtyfQpkaXZfZGF0ID0gcmVhZFJEUygiZGF0YS9leHByZXNzaW9uL2F4b2xvdGxfcmVjbHVzdC9FZHVfMV8yXzRfNl84XzEyX2ZpbF9oaWdodmFyZmVhdC5SRFMiKQpgYGAKClNhdmUgbmVjZXNzYXJ5IGRhdGEKCmBgYHtyfQpvdXRuYW1lID0gImRhdGEvcHJvY2Vzc2VkL2F4b2xvdGxfcGFydHMvZGl2X3JlZ2lvbnNfZGF0YS5tdHgiCm91dG5hbWUyID0gImRhdGEvcHJvY2Vzc2VkL2F4b2xvdGxfcGFydHMvZGl2X3JlZ2lvbnNfY291bnRzLm10eCIKaWYoIWZpbGUuZXhpc3RzKG91dG5hbWUpKXsKICBtZXRhZGF0YV9heCA9IGRpdl9kYXRAbWV0YS5kYXRhWyxjKCJzYW1wbGUiLCAiYmF0Y2giLCAiaGlnaGxldmVsX2NsdXN0ZXJzIildCiAgd3JpdGUuY3N2KG1ldGFkYXRhX2F4LCBmaWxlID0gImRhdGEvcHJvY2Vzc2VkL2F4b2xvdGxfcGFydHMvZGl2X3JlZ2lvbnNfbWV0YS5jc3YiLCAKICAgICAgICAgICAgY29sLm5hbWVzID0gVCwgcm93Lm5hbWVzID0gVCwgcXVvdGUgPSBGKQogIHdyaXRlLmNzdihkaXZfZGF0QGFzc2F5cyRSTkFAbWV0YS5mZWF0dXJlcywgCiAgICAgICAgICAgIGZpbGUgPSAiZGF0YS9wcm9jZXNzZWQvYXhvbG90bF9wYXJ0cy9kaXZfcmVnaW9uc19nZW5lcy5jc3YiLCAKICAgICAgICAgICAgY29sLm5hbWVzID0gVCwgcm93Lm5hbWVzID0gVCwgcXVvdGUgPSBGKQogIAogIE1hdHJpeDo6d3JpdGVNTShNYXRyaXg6OnQoZGl2X2RhdEBhc3NheXMkUk5BQGRhdGEpLCBvdXRuYW1lKQogIE1hdHJpeDo6d3JpdGVNTShNYXRyaXg6OnQoZGl2X2RhdEBhc3NheXMkUk5BQGNvdW50cyksIG91dG5hbWUyKQp9CmBgYAoKCgojIFJlZ2lvbiBwcmVkaWN0aW9ucwpMb2FkIHJlc3VsdHMgZnJvbSBtb2RlbHMKCmBgYHtyfQphbGxfcHJlZF9mID0gbGlzdC5maWxlcygicmVzdWx0cy9EaXYtc2VxLyIsIHBhdHRlcm4gPSAicHJlZHNfIikKYWxsX3ByZWRfZiA9IGFsbF9wcmVkX2ZbZ3JlcGwoImxyIiwgYWxsX3ByZWRfZikgJiAhZ3JlcGwoIkNUIiwgYWxsX3ByZWRfZildCiMgdGVzdCBzZXQgcmVzdWx0cwp0ZXN0X3JlcyA9IGxhcHBseShhbGxfcHJlZF9mW2dyZXBsKCJheC5jc3YiLCBhbGxfcHJlZF9mKV0sIAogICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZTAoInJlc3VsdHMvRGl2LXNlcS8iLCB4KSwgaGVhZGVyID0gVCkpCm5hbWVzKHRlc3RfcmVzKSA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYWxsX3ByZWRfZltncmVwbCgiYXguY3N2IiwgYWxsX3ByZWRfZildLCAiLiIsIGZpeGVkID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgeFsxXSkpCgojIERpdi1zZXEgcmVzdWx0cwpkaXZfcmVzID0gbGFwcGx5KGFsbF9wcmVkX2ZbZ3JlcGwoImRpdiIsIGFsbF9wcmVkX2YpXSwgCiAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgcmVhZC5jc3YocGFzdGUwKCJyZXN1bHRzL0Rpdi1zZXEvIiwgeCksIGhlYWRlciA9IFQpKQpuYW1lcyhkaXZfcmVzKSA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYWxsX3ByZWRfZltncmVwbCgiZGl2IiwgYWxsX3ByZWRfZildLCAiLiIsIGZpeGVkID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB4WzFdKSkKYGBgCgpDb25mdXNpb24gbWF0cmljZXMKCmBgYHtyfQp0ZXN0X2xhYnNfbCA9IGxpc3QoKQpmb3IoZyBpbiBjKCJhbGwiLCAiZGlmIiwgIm5ldSIpKXsKICBuMSA9IG5hbWVzKHRlc3RfcmVzKVtncmVwbChnLCBuYW1lcyh0ZXN0X3JlcykpICYgZ3JlcGwoImxyIiwgbmFtZXModGVzdF9yZXMpKV0KICB0ZXN0X2xhYnNfbFtbZ11dID0gdGVzdF9yZXNbW24xXV0KICBwcmludChnKQogIHByaW50KHRhYmxlKHRlc3RfbGFic19sW1tnXV0keV90ZXN0LCB0ZXN0X2xhYnNfbFtbZ11dJHByZWRfbHIpKQp9CgpkaXZfbGFic19sID0gbGlzdCgpCmZvcihnIGluIGMoImFsbCIsICJkaWYiLCAibmV1IikpewogIG4xID0gbmFtZXMoZGl2X3JlcylbZ3JlcGwoZywgbmFtZXMoZGl2X3JlcykpICYgZ3JlcGwoImxyIiwgbmFtZXMoZGl2X3JlcykpXQogIGRpdl9sYWJzX2xbW2ddXSA9IGRpdl9yZXNbW24xXV0KfSAKYGBgCgpDb21wYXJlIGFsbCB3aXRoIG5ldS9kaWYgKHRlc3Qgc2V0cyBhcmUgZGlmZmVyZW50IHNvIG92ZXJsYXAgaXMgbm90IGNvbXBsZXRlKQoKYGBge3J9CnRlc3RfYWxsX25ldSA9IG1lcmdlKHRlc3RfbGFic19sJGFsbCwgdGVzdF9sYWJzX2wkbmV1LCBieSA9IDEpCnRhYmxlKHRlc3RfYWxsX25ldSRwcmVkX2xyLngsIHRlc3RfYWxsX25ldSRwcmVkX2xyLnkpCgp0ZXN0X2FsbF9lcCA9IG1lcmdlKHRlc3RfbGFic19sJGFsbCwgdGVzdF9sYWJzX2wkZGlmLCBieSA9IDEpCnRhYmxlKHRlc3RfYWxsX2VwJHByZWRfbHIueCwgdGVzdF9hbGxfZXAkcHJlZF9sci55KQoKCmRpdl9hbGxfbmV1ID0gbWVyZ2UoZGl2X2xhYnNfbCRhbGwsIGRpdl9sYWJzX2wkbmV1LCBieSA9IDEpCnRhYmxlKGRpdl9hbGxfbmV1JHByZWRfbHIueCwgZGl2X2FsbF9uZXUkcHJlZF9sci55KQoKZGl2X2FsbF9lcCA9IG1lcmdlKGRpdl9sYWJzX2wkYWxsLCBkaXZfbGFic19sJGRpZiwgYnkgPSAxKQp0YWJsZShkaXZfYWxsX2VwJHByZWRfbHIueCwgZGl2X2FsbF9lcCRwcmVkX2xyLnkpCmBgYAoKUGxvdCBVTUFQIHdpdGggcmVnaW9ucwoKYGBge3J9CmRpdl9kYXQkcHJlZF9yZWdzID0gZGl2X3JlcyRwcmVkc19scl9kaXZfYWxsJHByZWRfbHIKRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSAidW1hcF9oYXJtb255IiwgZ3JvdXAuYnkgPSAiaGlnaGxldmVsX2NsdXN0ZXJzIiwgbGFiZWwgPSBUKQpEaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCBncm91cC5ieSA9ICJwcmVkX3JlZ3MiKQpGZWF0dXJlUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSAidW1hcF9oYXJtb255IiwgZmVhdHVyZXMgPSBjKCJTRlJQMSIsICJXTlQ4QiIsICJVTkM1QyIpKQoKcmVnX2NvbHNfc2ltcCA9IGMoIm1lZGlhbCIgPSAiIzUyMTY4RCIsICJkb3JzYWwiID0gIiNDNTYwMDciLCAibGF0ZXJhbCIgPSAiIzExODM5MiIpCgpwbHQgPSBEaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCBncm91cC5ieSA9ICJwcmVkX3JlZ3MiLCBzaHVmZmxlID0gVCkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSByZWdfY29sc19zaW1wKSsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxLAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKcGRmKCJyZXN1bHRzL0Rpdi1zZXEvRGl2c2VxX3Jlc3VsdHMvZGl2c2VxX3VtYXBfcmVnaW9ucy5wZGYiLCBoZWlnaHQgPSAyLjcsIHdpZHRoID0gMi43KQpwcmludChwbHQpCmRldi5vZmYoKQpgYGAKClBsb3QgY2hhbmdlcyBpbiBwcm9wb3J0aW9uCgpgYGB7cn0KdGFiX2N0X3JlZyA9IHRhYmxlKHBhc3RlMChkaXZfZGF0JHNhbXBsZSwgIi4uIiwgZGl2X2RhdCRoaWdoX2xldmVsX2Fubm8pLCBkaXZfZGF0JHByZWRfcmVncykKdGFiX2N0X3JlZyA9IGRhdGEuZnJhbWUodGFiX2N0X3JlZykKCnRhYl9jdF9yZWckdGltZSA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdF9yZWckVmFyMSksICJfIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHBhc3RlMCh4WzFdLCAiX3dwaSIpKSkKdGFiX2N0X3JlZyRjdCA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdF9yZWckVmFyMSksICIuLiIsIGZpeGVkID0gVCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHhbMl0pKQoKZm9yKHIgaW4gdW5pcXVlKHRhYl9jdF9yZWckdGltZSkpewogIGNjID0gdGFiX2N0X3JlZyR0aW1lPT1yCiAgdGFiX2N0X3JlZyRGcmVxW2NjXSA9IHRhYl9jdF9yZWckRnJlcVtjY10vc3VtKHRhYl9jdF9yZWckRnJlcVtjY10pCn0KCmZvcihyIGluIHVuaXF1ZSh0YWJfY3RfcmVnJGN0KSl7CiAgY2MgPSB0YWJfY3RfcmVnJGN0PT1yCiAgdGFiX2N0X3JlZyRGcmVxW2NjXSA9IHNjYWxlczo6cmVzY2FsZSh0YWJfY3RfcmVnJEZyZXFbY2NdLCBjKDAsMSkpCn0KCnRhYl9jdF9yZWckY3QgPSBmYWN0b3IodGFiX2N0X3JlZyRjdCwgbGV2ZWxzID0gYygibWljcm9nbGlhIiwgImVuZG8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcGVuZHltYWxfYSIsICJlcGVuZHltYWxfcSIsICJOUEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldXJvbmFsIikpCnRhYl9jdF9yZWckdGltZSA9IGZhY3Rvcih0YWJfY3RfcmVnJHRpbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gcmV2KGMoIjFfd3BpIiwgIjJfd3BpIiwgIjRfd3BpIiwgIjZfd3BpIiwgIjhfd3BpIiwgIjEyX3dwaSIpKSkKdGFiX2N0X3JlZyRWYXIyID0gZmFjdG9yKHRhYl9jdF9yZWckVmFyMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJtZWRpYWwiLCJkb3JzYWwiLCJsYXRlcmFsIikpCgpwbHQgPSBnZ3Bsb3QodGFiX2N0X3JlZywgYWVzKHggPSBWYXIyLCB5ID0gdGltZSwgCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IEZyZXEsIGFscGhhID0gRnJlcSwgY29sb3VyID0gVmFyMikpKwogIGZhY2V0X3dyYXAofmN0LCBuY29sID0gNikrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSByZWdfY29sc19zaW1wKSsKICBnZW9tX3BvaW50KCkrCiAgbGFicyh4ID0gIlJlZ2lvbiIsIHkgPSAiVGltZSIsIGNvbG91ciA9ICJSZWdpb24iLCAKICAgICAgIHNpemUgPSAiTm9ybS4gcHJvcG9ydGlvbiIsIGFscGhhID0gIk5vcm0uIHByb3BvcnRpb24iKSsKICB0aGVtZV9idygpKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gNyksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSkpCgpwZGYoInJlc3VsdHMvRGl2LXNlcS9EaXZzZXFfcmVzdWx0cy9wcm9wb3J0aW9uX3JlZ2lvbl9tYWpvcmN0X3RpbWUucGRmIiwgaGVpZ2h0ID0gMi43LCB3aWR0aCA9IDcuNSkKcHJpbnQocGx0KQpkZXYub2ZmKCkKYGBgCgoKCiMgQ2VsbCBUeXBlIHByZWRpY3Rpb25zCkxvYWQgcmVzdWx0cyBmcm9tIG1vZGVscwoKYGBge3J9CmFsbF9wcmVkX2YgPSBsaXN0LmZpbGVzKCJyZXN1bHRzL0Rpdi1zZXEvIiwgcGF0dGVybiA9ICJwcmVkc18iKQphbGxfcHJlZF9mID0gYWxsX3ByZWRfZltncmVwbCgicmZjIiwgYWxsX3ByZWRfZikgJiBncmVwbCgiQ1QiLCBhbGxfcHJlZF9mKV0KIyB0ZXN0IHNldCByZXN1bHRzCnRlc3RfcmVzID0gbGFwcGx5KGFsbF9wcmVkX2ZbZ3JlcGwoImF4LmNzdiIsIGFsbF9wcmVkX2YpXSwgCiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHJlYWQuY3N2KHBhc3RlMCgicmVzdWx0cy9EaXYtc2VxLyIsIHgpLCBoZWFkZXIgPSBUKSkKbmFtZXModGVzdF9yZXMpID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhbGxfcHJlZF9mW2dyZXBsKCJheC5jc3YiLCBhbGxfcHJlZF9mKV0sICIuIiwgZml4ZWQgPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB4WzFdKSkKCiMgRGl2LXNlcSByZXN1bHRzCmRpdl9yZXMgPSBsYXBwbHkoYWxsX3ByZWRfZltncmVwbCgiZGl2IiwgYWxsX3ByZWRfZildLCAKICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZTAoInJlc3VsdHMvRGl2LXNlcS8iLCB4KSwgaGVhZGVyID0gVCkpCm5hbWVzKGRpdl9yZXMpID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhbGxfcHJlZF9mW2dyZXBsKCJkaXYiLCBhbGxfcHJlZF9mKV0sICIuIiwgZml4ZWQgPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHhbMV0pKQpgYGAKClBsb3QgcHJlZGljdGlvbnMKCmBgYHtyfQpkaXZfZGF0JHByZWRfY3RhbGwgPSBkaXZfcmVzJHByZWRzX3JmY19DVF9kaXZfYWxsJHByZWRfcmZjW21hdGNoKGNvbG5hbWVzKGRpdl9kYXQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZfcmVzJHByZWRzX3JmY19DVF9kaXZfYWxsJFgpXQpkaXZfZGF0JHByZWRfY3RuZXUgPSBkaXZfcmVzJHByZWRzX3JmY19DVF9kaXZfbmV1JHByZWRfcmZjW21hdGNoKGNvbG5hbWVzKGRpdl9kYXQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZfcmVzJHByZWRzX3JmY19DVF9kaXZfbmV1JFgpXQpkaXZfZGF0JHByZWRfY3RuZXVbIShkaXZfZGF0JGhpZ2hfbGV2ZWxfYW5ubyAlaW4lIGMoIk5QQyIsICJuZXVyb25hbCIpKV0gPSBOQQpkaXZfZGF0JHByZWRfY3RkaWYgPSBkaXZfcmVzJHByZWRzX3JmY19DVF9kaXZfZGlmJHByZWRfcmZjW21hdGNoKGNvbG5hbWVzKGRpdl9kYXQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZfcmVzJHByZWRzX3JmY19DVF9kaXZfZGlmJFgpXQpkaXZfZGF0JHByZWRfY3RkaWZbIShkaXZfZGF0JGhpZ2hfbGV2ZWxfYW5ubyAlaW4lIGMoIm5ldXJvbmFsIikpXSA9IE5BCkRpbVBsb3QoZGl2X2RhdCwgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIsIGdyb3VwLmJ5ID0gImhpZ2hsZXZlbF9jbHVzdGVycyIsIGxhYmVsID0gVCkKRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSAidW1hcF9oYXJtb255IiwgZ3JvdXAuYnkgPSAicHJlZF9jdGFsbCIpCkRpbVBsb3QoZGl2X2RhdCwgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIsIGdyb3VwLmJ5ID0gInByZWRfY3RuZXUiKQpEaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCBncm91cC5ieSA9ICJwcmVkX2N0ZGlmIikKYGBgCgpMYWJlbCBzbW9vdGhpbmcKCmBgYHtyfQpkaXZfZGF0ID0gRmluZENsdXN0ZXJzKGRpdl9kYXQsIHJlc29sdXRpb24gPSBjKDIsIDUsIDEwLCAyMCwgMjUsIDUwKSwgYWxnb3JpdGhtID0gMiwgdmVyYm9zZSA9IEYpCkRpbVBsb3QoZGl2X2RhdCwgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIsIGdyb3VwLmJ5ID0gIlJOQV9zbm5fcmVzLjIiLCBsYWJlbCA9IFQpK05vTGVnZW5kKCkKRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSAidW1hcF9oYXJtb255IiwgZ3JvdXAuYnkgPSAiUk5BX3Nubl9yZXMuNSIsIGxhYmVsID0gVCkrTm9MZWdlbmQoKQpEaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCBncm91cC5ieSA9ICJSTkFfc25uX3Jlcy4xMCIsIGxhYmVsID0gVCkrTm9MZWdlbmQoKQpEaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCBncm91cC5ieSA9ICJSTkFfc25uX3Jlcy4yMCIsIGxhYmVsID0gVCkrTm9MZWdlbmQoKQpEaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCBncm91cC5ieSA9ICJSTkFfc25uX3Jlcy4yNSIsIGxhYmVsID0gVCkrTm9MZWdlbmQoKQpEaW1QbG90KGRpdl9kYXQsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCBncm91cC5ieSA9ICJSTkFfc25uX3Jlcy41MCIsIGxhYmVsID0gVCkrTm9MZWdlbmQoKQoKdGFiX292ZXJjbCA9IHRhYmxlKGRpdl9kYXQkUk5BX3Nubl9yZXMuMjAsIGRpdl9kYXQkcHJlZF9jdGFsbCkKdGFiX292ZXJjbCA9IHRhYl9vdmVyY2wvcm93U3Vtcyh0YWJfb3ZlcmNsKQphcHBseSh0YWJfb3ZlcmNsLCAxLCBmdW5jdGlvbih4KSBjb2xuYW1lcyh0YWJfb3ZlcmNsKVt3aGljaC5tYXgoeCldKQpzb3J0KHRhYmxlKGFwcGx5KHRhYl9vdmVyY2wsIDEsIGZ1bmN0aW9uKHgpIGNvbG5hbWVzKHRhYl9vdmVyY2wpW3doaWNoLm1heCh4KV0pKSkKc29ydChhcHBseSh0YWJfb3ZlcmNsLCAxLCBtYXgpKQpzdW0oYXBwbHkodGFiX292ZXJjbCwgMSwgbWF4KTwuNSkvbnJvdyh0YWJfb3ZlcmNsKQoKZGZfb3ZlcmNsID0gZGF0YS5mcmFtZSh0YWJfb3ZlcmNsKQpub21hamRmID0gdW5pcXVlKGRmX292ZXJjbFtkZl9vdmVyY2wkRnJlcTwuMzMsYygxLDEpXSkKY29sbmFtZXMobm9tYWpkZikgPSBjb2xuYW1lcyhkZl9vdmVyY2wpWzE6Ml0KbWFqZGYgPSBkZl9vdmVyY2xbZGZfb3ZlcmNsJEZyZXE+PS4zMywxOjJdCm1hdGNoX2RmID0gcmJpbmQobWFqZGYsIG5vbWFqZGZbIShub21hamRmJFZhcjEgJWluJSBtYWpkZiRWYXIxKSxdKQoKZGl2X2RhdCRwcmVkX3Ntb290aF8yMCA9IG1hdGNoX2RmJFZhcjJbbWF0Y2goZGl2X2RhdCRSTkFfc25uX3Jlcy4yMCwgbWF0Y2hfZGYkVmFyMSldCkRpbVBsb3QoZGl2X2RhdCwgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIsIGdyb3VwLmJ5ID0gInByZWRfc21vb3RoXzIwIiwgbGFiZWwgPSBUKStOb0xlZ2VuZCgpCkRpbVBsb3QoZGl2X2RhdCwgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIsIGdyb3VwLmJ5ID0gInByZWRfY3RhbGwiLCBsYWJlbCA9IFQpK05vTGVnZW5kKCkKYGBgCgpTYXZlIG5ldyBtZXRhZGF0YQoKYGBge3J9Cm1ldGFfZGl2X3ByZWQgPSBkaXZfZGF0QG1ldGEuZGF0YVssYygic2FtcGxlIiwgImhpZ2hfbGV2ZWxfYW5ubyIsICJoaWdobGV2ZWxfY2x1c3RlcnMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVkX3JlZ3MiLCAicHJlZF9jdGFsbCIsICJwcmVkX3Ntb290aF8yMCIpXQp3cml0ZS5jc3YobWV0YV9kaXZfcHJlZCwgZmlsZSA9ICJyZXN1bHRzL0Rpdi1zZXEvZGl2c2VxX3ByZWRpY3RlZF9tZXRhZGF0YS5jc3YiLCAKICAgICAgICAgIGNvbC5uYW1lcyA9IFQsIHJvdy5uYW1lcyA9IFQsIHF1b3RlID0gRikKYGBgCgoKIyMgRG90IHBsb3RzClJlZ2lvbiBjaGFuZ2VzIGluIG1ham9yIHByZWRpY3RlZCBjZWxsIHR5cGVzCgpgYGB7cn0KdGFiX2N0X3JlZyA9IHRhYmxlKG1ldGFfZGl2X3ByZWQkc2FtcGxlLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKG1ldGFfZGl2X3ByZWQkcHJlZF9zbW9vdGhfMjAsICIuLiIsIG1ldGFfZGl2X3ByZWQkcHJlZF9yZWdzKSkKdGFiX2N0X3JlZyA9IGRhdGEuZnJhbWUodGFiX2N0X3JlZykKCnRhYl9jdF9yZWckdGltZSA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdF9yZWckVmFyMSksICJfIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHBhc3RlMCh4WzFdLCAiX3dwaSIpKSkKdGFiX2N0X3JlZyRwcmVkX3JlZyA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdF9yZWckVmFyMiksICIuLiIsIGZpeGVkID0gVCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHhbMl0pKQp0YWJfY3RfcmVnJHByZWRfY3QgPSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0YWJfY3RfcmVnJFZhcjIpLCAiLi4iLCBmaXhlZCA9IFQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB4WzFdKSkKCmxhcmdlc3RfY3QgPSBjKCkKZm9yKHIgaW4gdW5pcXVlKHRhYl9jdF9yZWckdGltZSkpeyAjIGdldCB0aGUgeCBtb3N0IGZyZXF1ZW50IGNlbGwgdHlwZXMvdHAKICBjYyA9IHRhYl9jdF9yZWckdGltZT09cgogIHRhYl9jdF9yZWckRnJlcVtjY10gPSB0YWJfY3RfcmVnJEZyZXFbY2NdL3N1bSh0YWJfY3RfcmVnJEZyZXFbY2NdKQogIGxhcmdlc3RfY3QgPSB1bmlxdWUoYyhsYXJnZXN0X2N0LCAKICAgICAgICAgICAgICAgICAgICAgICAgdGFiX2N0X3JlZyRwcmVkX2N0W2NjXVtvcmRlcih0YWJfY3RfcmVnJEZyZXFbY2NdLCBkZWNyZWFzaW5nID0gVCldWzE6OF0pKQogIGxhcmdlc3RfY3QgPSBsYXJnZXN0X2N0W2dyZXBsKCJfIiwgbGFyZ2VzdF9jdCldCn0KCnRhYl9jdF9yZWcgPSB0YWJfY3RfcmVnW3RhYl9jdF9yZWckcHJlZF9jdCAlaW4lIGxhcmdlc3RfY3QsXQoKZm9yKHIgaW4gdW5pcXVlKHRhYl9jdF9yZWckcHJlZF9jdCkpewogIGNjID0gdGFiX2N0X3JlZyRwcmVkX2N0PT1yCiAgdGFiX2N0X3JlZyRGcmVxW2NjXSA9IHNjYWxlczo6cmVzY2FsZSh0YWJfY3RfcmVnJEZyZXFbY2NdLCBjKDAsMSkpCn0KCnRhYl9jdF9yZWckdGltZSA9IGZhY3Rvcih0YWJfY3RfcmVnJHRpbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gcmV2KGMoIjFfd3BpIiwgIjJfd3BpIiwgIjRfd3BpIiwgIjZfd3BpIiwgIjhfd3BpIiwgIjEyX3dwaSIpKSkKdGFiX2N0X3JlZyRwcmVkX3JlZyA9IGZhY3Rvcih0YWJfY3RfcmVnJHByZWRfcmVnLCBsZXZlbHMgPSBjKCJtZWRpYWwiLCJkb3JzYWwiLCJsYXRlcmFsIikpCgpyZWdfY29sc19zaW1wID0gYygibWVkaWFsIiA9ICIjNTIxNjhEIiwgImRvcnNhbCIgPSAiI0M1NjAwNyIsICJsYXRlcmFsIiA9ICIjMTE4MzkyIikKCnBsdCA9IGdncGxvdCh0YWJfY3RfcmVnLCBhZXMoeCA9IHByZWRfcmVnLCB5ID0gdGltZSwgCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IEZyZXEsIGFscGhhID0gRnJlcSwgY29sb3VyID0gcHJlZF9yZWcpKSsKICBmYWNldF93cmFwKH5wcmVkX2N0LCBuY29sID0gNikrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSByZWdfY29sc19zaW1wKSsKICBnZW9tX3BvaW50KCkrCiAgbGFicyh4ID0gIlJlZ2lvbiIsIHkgPSAiVGltZSIsIGNvbG91ciA9ICJSZWdpb24iLCAKICAgICAgIHNpemUgPSAiTm9ybS4gcHJvcG9ydGlvbiIsIGFscGhhID0gIk5vcm0uIHByb3BvcnRpb24iKSsKICB0aGVtZV9idygpKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gNyksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSkpCgpwZGYoInJlc3VsdHMvRGl2LXNlcS9EaXZzZXFfcmVzdWx0cy9wcm9wb3J0aW9uX3JlZ2lvbl9wcmVkY3RfdGltZS5wZGYiLCBoZWlnaHQgPSA1LCB3aWR0aCA9IDcuNSkKcHJpbnQocGx0KQpkZXYub2ZmKCkKYGBgCgpTY2F0dGVycGllIG9mIHByZXZpb3VzIHBsb3QKCmBgYHtyfQp0YWJfY3RfcmVnID0gdGFibGUobWV0YV9kaXZfcHJlZCRzYW1wbGUsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAobWV0YV9kaXZfcHJlZCRwcmVkX3Ntb290aF8yMCwgIi4uIiwgbWV0YV9kaXZfcHJlZCRwcmVkX3JlZ3MpKQp0YWJfY3RfcmVnID0gZGF0YS5mcmFtZSh0YWJfY3RfcmVnKQoKdGFiX2N0X3JlZyR0aW1lID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhcy5jaGFyYWN0ZXIodGFiX2N0X3JlZyRWYXIxKSwgIl8iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgcGFzdGUwKHhbMV0sICJfd3BpIikpKQp0YWJfY3RfcmVnJHByZWRfcmVnID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhcy5jaGFyYWN0ZXIodGFiX2N0X3JlZyRWYXIyKSwgIi4uIiwgZml4ZWQgPSBUKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgeFsyXSkpCnRhYl9jdF9yZWckcHJlZF9jdCA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdF9yZWckVmFyMiksICIuLiIsIGZpeGVkID0gVCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHhbMV0pKQoKdGFiX2N0X3JlZyRwcm9wID0gdGFiX2N0X3JlZyRGcmVxCmxhcmdlc3RfY3QgPSBjKCkKZm9yKHIgaW4gdW5pcXVlKHRhYl9jdF9yZWckdGltZSkpeyAjIGdldCB0aGUgeCBtb3N0IGZyZXF1ZW50IGNlbGwgdHlwZXMvdHAKICBjYyA9IHRhYl9jdF9yZWckdGltZT09cgogIHRhYl9jdF9yZWckcHJvcFtjY10gPSB0YWJfY3RfcmVnJHByb3BbY2NdL3N1bSh0YWJfY3RfcmVnJHByb3BbY2NdKQogIGxhcmdlc3RfY3QgPSB1bmlxdWUoYyhsYXJnZXN0X2N0LCAKICAgICAgICAgICAgICAgICAgICAgICAgdGFiX2N0X3JlZyRwcmVkX2N0W2NjXVtvcmRlcih0YWJfY3RfcmVnJHByb3BbY2NdLCBkZWNyZWFzaW5nID0gVCldWzE6OF0pKQogIGxhcmdlc3RfY3QgPSBsYXJnZXN0X2N0W2dyZXBsKCJfIiwgbGFyZ2VzdF9jdCldCn0KCnRhYl9jdF9yZWcgPSB0YWJfY3RfcmVnW3RhYl9jdF9yZWckcHJlZF9jdCAlaW4lIGxhcmdlc3RfY3QsXQoKdGFiX3RpbWVjdF9yZWcgPSB0KHJlc2hhcGUyOjpkY2FzdChwcmVkX3JlZ350aW1lK3ByZWRfY3QsIHZhbHVlLnZhciA9ICJGcmVxIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRhYl9jdF9yZWcsIGZpbGwgPSAwKSkKY29sbmFtZXModGFiX3RpbWVjdF9yZWcpID0gdGFiX3RpbWVjdF9yZWdbMSxdCnRhYl90aW1lY3RfcmVnID0gZGF0YS5mcmFtZSh0YWJfdGltZWN0X3JlZ1stMSxdKQp0YWJfdGltZWN0X3JlZyR0aW1lID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChyb3duYW1lcyh0YWJfdGltZWN0X3JlZyksICJfd3BpXyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgcGFzdGUwKHhbMV0sICJfd3BpIikpKQp0YWJfdGltZWN0X3JlZyRjdCA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQocm93bmFtZXModGFiX3RpbWVjdF9yZWcpLCAiX3dwaV8iKSwgZnVuY3Rpb24oeCkgeFsyXSkpCnRhYl90aW1lY3RfcmVnJGRvcnNhbCA9IGFzLm51bWVyaWModGFiX3RpbWVjdF9yZWckZG9yc2FsKQp0YWJfdGltZWN0X3JlZyRsYXRlcmFsID0gYXMubnVtZXJpYyh0YWJfdGltZWN0X3JlZyRsYXRlcmFsKQp0YWJfdGltZWN0X3JlZyRtZWRpYWwgPSBhcy5udW1lcmljKHRhYl90aW1lY3RfcmVnJG1lZGlhbCkKCnRhYl90aW1lY3RfcmVnID0gdGFiX3RpbWVjdF9yZWdbdGFiX3RpbWVjdF9yZWckY3QhPSJtaWNyb2dsaWFfOCIsXQoKcHJvcHN0aW1lID0gdW5saXN0KHVubmFtZSh0YXBwbHkoYXBwbHkodGFiX3RpbWVjdF9yZWdbLDE6M10sIDEsIHN1bSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJfdGltZWN0X3JlZyR0aW1lLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkpKQoKdGFiX3RpbWVjdF9yZWckcHJvcHN0aW1lID0gcHJvcHN0aW1lW3Jvd25hbWVzKHRhYl90aW1lY3RfcmVnKV0KCmZvcihyIGluIHVuaXF1ZSh0YWJfdGltZWN0X3JlZyRjdCkpewogIGNjID0gdGFiX3RpbWVjdF9yZWckY3Q9PXIKICB0YWJfdGltZWN0X3JlZyRwcm9wc3RpbWVbY2NdID0gc2NhbGVzOjpyZXNjYWxlKHRhYl90aW1lY3RfcmVnJHByb3BzdGltZVtjY10sIGMoMCwxKSkKfQoKdGFiX3RpbWVjdF9yZWckZ2cgPSAxOm5yb3codGFiX3RpbWVjdF9yZWcpCgp0YWJfdGltZWN0X3JlZyR0aW1lID0gZmFjdG9yKHRhYl90aW1lY3RfcmVnJHRpbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjFfd3BpIiwiMl93cGkiLCI0X3dwaSIsIjZfd3BpIiwiOF93cGkiLCIxMl93cGkiKSkKdGFiX3RpbWVjdF9yZWckY3QgPSBmYWN0b3IodGFiX3RpbWVjdF9yZWckY3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSByZXYoYygiZXBlbl9jbHVzXzQiLCAiZXBlbl9jbHVzXzMiLCAiZXBlbl9jbHVzXzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJucGNfU1VCU0VUXzciLCJucGNfU1VCU0VUXzgiLCJucGNfU1VCU0VUXzMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJucGNfU1VCU0VUXzQiLCJucGNfU1VCU0VUXzEwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2x1dF9TVUJTRVRfMTAiLCAiZ2x1dF9TVUJTRVRfMyIsICJnbHV0X1NVQlNFVF8xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2x1dF9TVUJTRVRfNCIsICJnbHV0X1NVQlNFVF8wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0FCQV9TVUJTRVRfMyIsIkdBQkFfU1VCU0VUXzQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHQUJBX1NVQlNFVF8xIiwiR0FCQV9TVUJTRVRfMTQiKSkpCgpzY3BsdCA9IGdncGxvdCgpKwogIGdlb21fc2NhdHRlcnBpZShhZXMoeD1hcy5udW1lcmljKHRpbWUpLCB5PWFzLm51bWVyaWMoY3QpLCAKICAgICAgICAgICAgICAgICAgICAgIGdyb3VwPWdnLCByPXByb3BzdGltZS8yKSwgZGF0YT10YWJfdGltZWN0X3JlZywKICAgICAgICAgICAgICAgICAgY29scz1jKCJtZWRpYWwiLCAiZG9yc2FsIiwgImxhdGVyYWwiKSkrIAogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBsZXZlbHModGFiX3RpbWVjdF9yZWckdGltZSksCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IDE6NikrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxldmVscyh0YWJfdGltZWN0X3JlZyRjdCksCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IDE6bGVuZ3RoKGxldmVscyh0YWJfdGltZWN0X3JlZyRjdCkpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSByZWdfY29sc19zaW1wKSsKICBjb29yZF9lcXVhbCgpKwogIGxhYnMoeCA9ICJ0aW1lIiwgeSA9ICJjZWxsIHR5cGUiLCBmaWxsID0gInJlZ2lvbiIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIsIHNpemUgPSA2KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LjUpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCnBkZigicmVzdWx0cy9EaXYtc2VxL0RpdnNlcV9yZXN1bHRzL3Byb3BvcnRpb25fcmVnaW9uX3ByZWRjdF90aW1lX3BpZS5wZGYiLCBoZWlnaHQgPSA3LjUsIHdpZHRoID0gMykKcHJpbnQoc2NwbHQpCmRldi5vZmYoKQpgYGAKClNjYXR0ZXJwaWUgb2YgbWFqb3IgY2VsbCB0eXBlcwoKYGBge3J9CiMgY291bnQgdGltZSB2cyBjdC4ucmVnaW9uCm1ham9yX2N0X3ByZWQgPSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KG1ldGFfZGl2X3ByZWQkcHJlZF9jdGFsbCwgIl8iKSwgZnVuY3Rpb24oeCkgeFsxXSkpCnRhYl9jdF9yZWcgPSB0YWJsZShtZXRhX2Rpdl9wcmVkJHNhbXBsZSwKICAgICAgICAgICAgICAgICAgIHBhc3RlMChtYWpvcl9jdF9wcmVkLCAiLi4iLCBtZXRhX2Rpdl9wcmVkJHByZWRfcmVncykpCnRhYl9jdF9yZWcgPSBkYXRhLmZyYW1lKHRhYl9jdF9yZWcpCgojIHVucmF2ZWwKdGFiX2N0X3JlZyR0aW1lID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhcy5jaGFyYWN0ZXIodGFiX2N0X3JlZyRWYXIxKSwgIl8iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgcGFzdGUwKHhbMV0sICJfd3BpIikpKQp0YWJfY3RfcmVnJHByZWRfcmVnID0gdW5saXN0KGxhcHBseShzdHJzcGxpdChhcy5jaGFyYWN0ZXIodGFiX2N0X3JlZyRWYXIyKSwgIi4uIiwgZml4ZWQgPSBUKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgeFsyXSkpCnRhYl9jdF9yZWckcHJlZF9jdCA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdF9yZWckVmFyMiksICIuLiIsIGZpeGVkID0gVCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHhbMV0pKQoKIyBnZXQgcHJvcG9ydGlvbnMKdGFiX2N0X3JlZyRwcm9wID0gdGFiX2N0X3JlZyRGcmVxCmZvcihyIGluIHVuaXF1ZSh0YWJfY3RfcmVnJHRpbWUpKXsKICBjYyA9IHRhYl9jdF9yZWckdGltZT09cgogIHRhYl9jdF9yZWckcHJvcFtjY10gPSB0YWJfY3RfcmVnJHByb3BbY2NdL3N1bSh0YWJfY3RfcmVnJHByb3BbY2NdKQp9CgojIGdldCBjb3VudHMgcGVyIHJlZ2lvbgp0YWJfdGltZWN0X3JlZyA9IHQocmVzaGFwZTI6OmRjYXN0KHByZWRfcmVnfnRpbWUrcHJlZF9jdCwgdmFsdWUudmFyID0gIkZyZXEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGFiX2N0X3JlZywgZmlsbCA9IDApKQpjb2xuYW1lcyh0YWJfdGltZWN0X3JlZykgPSB0YWJfdGltZWN0X3JlZ1sxLF0KdGFiX3RpbWVjdF9yZWcgPSBkYXRhLmZyYW1lKHRhYl90aW1lY3RfcmVnWy0xLF0pCgojIHVucmF2ZWwKdGFiX3RpbWVjdF9yZWckdGltZSA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQocm93bmFtZXModGFiX3RpbWVjdF9yZWcpLCAiX3dwaV8iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHBhc3RlMCh4WzFdLCAiX3dwaSIpKSkKdGFiX3RpbWVjdF9yZWckY3QgPSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KHJvd25hbWVzKHRhYl90aW1lY3RfcmVnKSwgIl93cGlfIiksIGZ1bmN0aW9uKHgpIHhbMl0pKQp0YWJfdGltZWN0X3JlZyRkb3JzYWwgPSBhcy5udW1lcmljKHRhYl90aW1lY3RfcmVnJGRvcnNhbCkKdGFiX3RpbWVjdF9yZWckbGF0ZXJhbCA9IGFzLm51bWVyaWModGFiX3RpbWVjdF9yZWckbGF0ZXJhbCkKdGFiX3RpbWVjdF9yZWckbWVkaWFsID0gYXMubnVtZXJpYyh0YWJfdGltZWN0X3JlZyRtZWRpYWwpCgojIHByb3BvcnRpb25zIG9mIGNlbGwgdHlwZSBwZXIgdGltZQpwcm9wc3RpbWUgPSB1bmxpc3QodW5uYW1lKHRhcHBseShhcHBseSh0YWJfdGltZWN0X3JlZ1ssMTozXSwgMSwgc3VtKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYl90aW1lY3RfcmVnJHRpbWUsIGZ1bmN0aW9uKHgpIHgvc3VtKHgpKSkpCnRhYl90aW1lY3RfcmVnJHByb3BzdGltZSA9IHByb3BzdGltZVtyb3duYW1lcyh0YWJfdGltZWN0X3JlZyldCgojIHNjYWxlIHRoZSBwcm9wb3J0aW9ucyBwZXIgY2VsbCB0eXBlCmZvcihyIGluIHVuaXF1ZSh0YWJfdGltZWN0X3JlZyRjdCkpewogIGNjID0gdGFiX3RpbWVjdF9yZWckY3Q9PXIKICB0YWJfdGltZWN0X3JlZyRwcm9wc3RpbWVbY2NdID0gc2NhbGVzOjpyZXNjYWxlKHRhYl90aW1lY3RfcmVnJHByb3BzdGltZVtjY10sIGMoMCwxKSkKfQp0YWJfdGltZWN0X3JlZyRnZyA9IDE6bnJvdyh0YWJfdGltZWN0X3JlZykgI3JlcXVpcmVkIGZvciBwbG90Cgp0YWJfdGltZWN0X3JlZyR0aW1lID0gZmFjdG9yKHRhYl90aW1lY3RfcmVnJHRpbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjFfd3BpIiwiMl93cGkiLCI0X3dwaSIsIjZfd3BpIiwiOF93cGkiLCIxMl93cGkiKSkKdGFiX3RpbWVjdF9yZWckY3QgPSBmYWN0b3IodGFiX3RpbWVjdF9yZWckY3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSByZXYoYygiZXBlbiIsICJucGMiLCAiZ2x1dCIsICJHQUJBIiwib2xpZ29kZW5kcm9jeXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWljcm9nbGlhIiwgImVuZG90aGVsaWFsIikpKQoKc2NwbHQgPSBnZ3Bsb3QoKSsKICBnZW9tX3NjYXR0ZXJwaWUoYWVzKHg9YXMubnVtZXJpYyh0aW1lKSwgeT1hcy5udW1lcmljKGN0KSwgCiAgICAgICAgICAgICAgICAgICAgICBncm91cD1nZywgcj1wcm9wc3RpbWUvMiksIGRhdGE9dGFiX3RpbWVjdF9yZWcsCiAgICAgICAgICAgICAgICAgIGNvbHM9YygibWVkaWFsIiwgImRvcnNhbCIsICJsYXRlcmFsIikpKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbGV2ZWxzKHRhYl90aW1lY3RfcmVnJHRpbWUpLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSAxOjYpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBsZXZlbHModGFiX3RpbWVjdF9yZWckY3QpLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSAxOmxlbmd0aChsZXZlbHModGFiX3RpbWVjdF9yZWckY3QpKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcmVnX2NvbHNfc2ltcCkrCiAgY29vcmRfZXF1YWwoKSsKICBsYWJzKHggPSAidGltZSIsIHkgPSAiY2VsbCB0eXBlIiwgZmlsbCA9ICJyZWdpb24iKSsKICB0aGVtZV9idygpKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gNiksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNi41KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgojIGFkZCBnbG9iYWwgY2VsbCB0eXBlIHByb3BvcnRpb25zIHBlciByZWdpb24KcHJvcF9kZiA9IGRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShtYWpvcl9jdF9wcmVkLCBtZXRhX2Rpdl9wcmVkJHByZWRfcmVncykpKQpwcm9wX2RmJG1ham9yX2N0X3ByZWQgPSBmYWN0b3IocHJvcF9kZiRtYWpvcl9jdF9wcmVkLCBsZXZlbHMgPSBsZXZlbHModGFiX3RpbWVjdF9yZWckY3QpKQoKY29sX3Byb3AgPSBnZ3Bsb3QoKSsKICBnZW9tX2NvbChkYXRhID0gcHJvcF9kZiwgbWFwcGluZyA9IGFlcyh4ID0gRnJlcSwgeSA9IG1ham9yX2N0X3ByZWQsIGZpbGwgPSBWYXIyKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLC4zNykpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJlZ19jb2xzX3NpbXApKwogIGxhYnMoeCA9ICJwcm9wb3J0aW9uIikrCiAgdGhlbWVfdm9pZCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZSgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIsIHNpemUgPSA2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IDMwLCB2anVzdCA9IDEsIGhqdXN0ID0gMSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LjUpLAogICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKCksCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9saW5lKCkpCgpwZGYoInJlc3VsdHMvRGl2LXNlcS9EaXZzZXFfcmVzdWx0cy9wcm9wb3J0aW9uX3JlZ2lvbl9wcmVkY3RfdGltZV9waWVfYmFyLnBkZiIsIAogICAgaGVpZ2h0ID0gMywgd2lkdGggPSAzLjY1KQpzY3BsdCArIGNvbF9wcm9wICsgcGxvdF9sYXlvdXQod2lkdGhzID0gYygxLDAuMikpICYgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDAsMCksICJjbSIpKQpkZXYub2ZmKCkKYGBgCgoKIyMgQmFycGxvdHMKUHJlZGljdGVkIGNlbGwgdHlwZSBhYnVuZGFuY2VzCgpgYGB7cn0KdGFiX2N0YWxsID0gZGF0YS5mcmFtZSh0YWJsZShtZXRhX2Rpdl9wcmVkJHNhbXBsZSxtZXRhX2Rpdl9wcmVkJHByZWRfY3RhbGwpKQp0YWJfY3RhbGwkbWFqb3JjdCA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdGFsbCRWYXIyKSwgIl8iKSwgZnVuY3Rpb24oeCkgeFsxXSkpCnRhYl9jdGFsbCRtYWpvcmN0ID0gZmFjdG9yKHRhYl9jdGFsbCRtYWpvcmN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZXBlbiIsICJucGMiLCAiZ2x1dCIsICJHQUJBIiwgIm1pY3JvZ2xpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9saWdvZGVuZHJvY3l0ZSIsICJlbmRvdGhlbGlhbCIpKQpjdG9yZCA9IHNvcnQodGFibGUobWV0YV9kaXZfcHJlZCRwcmVkX2N0YWxsKSkKdGFiX2N0YWxsJFZhcjIgPSBmYWN0b3IodGFiX2N0YWxsJFZhcjIsIGxldmVscyA9IG5hbWVzKGN0b3JkKSkKCnBkZigicmVzdWx0cy9EaXYtc2VxL0RpdnNlcV9yZXN1bHRzL3ByZWRDZWxsVHlwZV9hYnVuZGFuY2VfdGltZXBvaW50LnBkZiIsIGhlaWdodCA9IDkuNSwgd2lkdGggPSA3LjUpCmdncGxvdCh0YWJfY3RhbGwsIGFlcyh4ID0gRnJlcSwgeSA9IFZhcjIsIGZpbGwgPSBWYXIxKSkrCiAgZmFjZXRfZ3JpZChtYWpvcmN0flZhcjEsIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZV95IikrCiAgZ2VvbV9jb2woY29sb3VyID0gImdyZXk1MCIpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg2LCAiUHVCdUduIikpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LjUsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpkZXYub2ZmKCkKCnBkZigicmVzdWx0cy9EaXYtc2VxL0RpdnNlcV9yZXN1bHRzL3ByZWRDZWxsVHlwZV9hYnVuZGFuY2VfY2VsbHR5cGUucGRmIiwgaGVpZ2h0ID0gOS41LCB3aWR0aCA9IDcuNSkKZ2dwbG90KHRhYl9jdGFsbCwgYWVzKHggPSBGcmVxLCB5ID0gVmFyMiwgZmlsbCA9IFZhcjIpKSsKICBmYWNldF9ncmlkKG1ham9yY3R+VmFyMSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlX3kiKSsKICBnZW9tX2NvbCgpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbHNfY2MpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LjUsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpkZXYub2ZmKCkKYGBgCgpQcmVkaWN0ZWQgY2VsbCB0eXBlIGFidW5kYW5jZXMsIHdpdGggcHJlZGljdGVkIHJlZ2lvbgoKYGBge3J9CnRhYl9jdGFsbCA9IGRhdGEuZnJhbWUodGFibGUobWV0YV9kaXZfcHJlZCRzYW1wbGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMChtZXRhX2Rpdl9wcmVkJHByZWRfY3RhbGwsICIuLiIsIG1ldGFfZGl2X3ByZWQkcHJlZF9yZWdzKSkpCnRhYl9jdGFsbCRjdCA9IHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRhYl9jdGFsbCRWYXIyKSwgIi4uIiwgZml4ZWQgPSBUKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgeFsxXSkpCnRhYl9jdGFsbCRyZWcgPSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0YWJfY3RhbGwkVmFyMiksICIuLiIsIGZpeGVkID0gVCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB4WzJdKSkKdGFiX2N0YWxsJG1ham9yY3QgPSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0YWJfY3RhbGwkVmFyMiksICJfIiksIGZ1bmN0aW9uKHgpIHhbMV0pKQp0YWJfY3RhbGwkbWFqb3JjdCA9IGZhY3Rvcih0YWJfY3RhbGwkbWFqb3JjdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImVwZW4iLCAibnBjIiwgImdsdXQiLCAiR0FCQSIsICJtaWNyb2dsaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbGlnb2RlbmRyb2N5dGUiLCAiZW5kb3RoZWxpYWwiKSkKCmN0b3JkID0gc29ydCh0YWJsZShtZXRhX2Rpdl9wcmVkJHByZWRfY3RhbGwpKQp0YWJfY3RhbGwkY3QgPSBmYWN0b3IodGFiX2N0YWxsJGN0LCBsZXZlbHMgPSBuYW1lcyhjdG9yZCkpCgpwZGYoInJlc3VsdHMvRGl2LXNlcS9EaXZzZXFfcmVzdWx0cy9wcmVkQ2VsbFR5cGVfYWJ1bmRhbmNlX3ByZWRSZWdpb24ucGRmIiwgaGVpZ2h0ID0gOS41LCB3aWR0aCA9IDcuNSkKZ2dwbG90KHRhYl9jdGFsbCwgYWVzKHggPSBGcmVxLCB5ID0gY3QsIGZpbGwgPSByZWcpKSsKICBmYWNldF9ncmlkKG1ham9yY3R+VmFyMSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlX3kiKSsKICBnZW9tX2NvbCgpKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJlZ19jb2xzX3NpbXApKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LjUsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpkZXYub2ZmKCkKYGBgCgpCYXJwbG90cyBmb3IgZ2x1dCBhbmQgTlBDCgpgYGB7cn0KcGxvdF9kZiA9IG1ldGFfZGl2X3ByZWRbLGMoMSw0LDUpXQpwbG90X2RmJHNhbXBsZVtwbG90X2RmJHNhbXBsZT09IjFfd3BpX3BvcyJdID0gIjFfd3BpIgpwbG90X2RmJHNhbXBsZSA9IGZhY3RvcihwbG90X2RmJHNhbXBsZSwgbGV2ZWxzID0gcmV2KHBhc3RlMChjKDEsMiw0LDYsOCwxMiksICJfd3BpIikpKQpwbG90X2RmJHByZWRfcmVncyA9IGZhY3RvcihwbG90X2RmJHByZWRfcmVncywgbGV2ZWxzID0gYygibWVkaWFsIiwgImRvcnNhbCIsICJsYXRlcmFsIikpCmZvcihpIGluIGMoImdsdXRfIiwgIm5wY18iKSl7CiAgc3ViX3Bsb3RfZGYgPSBwbG90X2RmW2dyZXBsKGksIHBsb3RfZGYkcHJlZF9jdGFsbCksXQogIHN1Yl9wbG90X2RmJHByZWRfY3RhbGwgPSBnc3ViKHBhc3RlMChpLCAiU1VCU0VUXyIpLCAiIiwgc3ViX3Bsb3RfZGYkcHJlZF9jdGFsbCkKICBsdmxzID0gaWYoaT09ImdsdXRfIil7CiAgICBjKDksMTAsMjIsMjcsMTksMTQsMTcsMjYsOCw2LDIwLDEsMTEsMTMsMjUsMiwyMSwxNiwzLDAsMTIsNyw1LDQsMjQsMTUsMTgpCiAgfSBlbHNlIHtjKDIsMTMsMCwxNCwxLDMsOSw0LDExLDcpfQogIHN1Yl9wbG90X2RmID0gc3ViX3Bsb3RfZGZbc3ViX3Bsb3RfZGYkcHJlZF9jdGFsbCAlaW4lIGFzLmNoYXJhY3RlcihsdmxzKSxdCiAgc3ViX3Bsb3RfZGYkcHJlZF9jdGFsbCA9IGZhY3RvcihzdWJfcGxvdF9kZiRwcmVkX2N0YWxsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGFzLmNoYXJhY3RlcihsdmxzKSkKICBsaW1tYXggPSBtYXgodGFibGUoc3ViX3Bsb3RfZGYkcHJlZF9jdGFsbCkpCiAgCiAgZm9yKGdnIGluIGMoInNhbXBsZSIsICJwcmVkX3JlZ3MiLCAiZ3JleTI1IikpewogICAgY29sc191c2UgPSBpZihnZz09InByZWRfcmVncyIpewogICAgICByZWdfY29sc19zaW1wCiAgICB9IGVsc2UgaWYoZ2c9PSJzYW1wbGUiKXsKICAgICAgcmV2KGNvbG9yUmFtcFBhbGV0dGUoYygiZ3JleTg1IiwgIiNkZjE2ZGYiKSkoNikpCiAgICB9CiAgICBwbHQgPSBnZ3Bsb3Qoc3ViX3Bsb3RfZGYpKwogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsIGxpbW1heCswLjA1KmxpbW1heCkpKwogICAgICB0aGVtZV9jbGFzc2ljKCkrCiAgICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIsIHNpemUgPSA3KSwKICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDYpLAogICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC40LCAiY20iKSwKICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKQogICAgaWYoZ2chPSJncmV5MjUiKXsKICAgICAgcGx0ID0gcGx0K2dlb21fYmFyKG1hcHBpbmcgPSBhZXNfc3RyaW5nKHggPSAicHJlZF9jdGFsbCIsIGZpbGwgPSBnZykpKwogICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbHNfdXNlKQogICAgfSBlbHNlewogICAgICBwbHQgPSBwbHQrZ2VvbV9iYXIobWFwcGluZyA9IGFlc19zdHJpbmcoeCA9ICJwcmVkX2N0YWxsIiksIGZpbGwgPSBnZykKICAgIH0KICAgIHBkZihwYXN0ZTAoInJlc3VsdHMvRGl2LXNlcS9iYXJwbG90c19nbHV0bnBjL2Jhcl8iLCBpLCBnZywgIi5wZGYiKSwgd2lkdGggPSA0LjgsIGhlaWdodCA9IDEuMjUpCiAgICBwcmludChwbHQpCiAgICBkZXYub2ZmKCkKICB9Cn0KYGBgCgoKIyMgVU1BUHMKVU1BUCB3aXRoIHByZWRpY3RlZCBjZWxsIHR5cGVzCgpgYGB7cn0KcGx0ID0gRGltUGxvdChkaXZfZGF0LCByZWR1Y3Rpb24gPSAidW1hcF9oYXJtb255IiwgZ3JvdXAuYnkgPSAicHJlZF9jdGFsbCIsIHNodWZmbGUgPSBUKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbHNfY2MpKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEsCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpwZGYoInJlc3VsdHMvRGl2LXNlcS9EaXZzZXFfcmVzdWx0cy9kaXZzZXFfdW1hcF9wcmVkY3QucGRmIiwgaGVpZ2h0ID0gMi43LCB3aWR0aCA9IDIuNykKcHJpbnQocGx0KQpkZXYub2ZmKCkKYGBgCgoKIyMgTGluZSBwbG90CkxpbmUgcGxvdCBmb3IgbWFqb3IgY2VsbCB0eXBlcwoKYGBge3J9Cm1ham9yY3QgPSBzYXBwbHkoc3Ryc3BsaXQobWV0YV9kaXZfcHJlZCRwcmVkX2N0YWxsLCAiXyIpLCBmdW5jdGlvbih4KSB4WzFdKQptYWpvcmN0W21ldGFfZGl2X3ByZWQkcHJlZF9jdGFsbCAlaW4lIGMoImVwZW5fY2x1c180IiwgImVwZW5fY2x1c18zIildID0gImVwZW5fYSIKbWFqb3JjdFttZXRhX2Rpdl9wcmVkJHByZWRfY3RhbGwgJWluJSBjKCJlcGVuX2NsdXNfMSIsICJlcGVuX2NsdXNfMTMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcGVuX2NsdXNfNyIsImVwZW5fY2x1c18xNCIpXSA9ICJlcGVuX24iCnBsb3RfZGYgPSByZXNoYXBlMjo6bWVsdChwcm9wLnRhYmxlKHRhYmxlKG1ham9yY3QsIG1ldGFfZGl2X3ByZWQkc2FtcGxlKSwgbWFyZ2luID0gMikpCnBsb3RfZGYkVmFyMiA9IGFzLmNoYXJhY3RlcihwbG90X2RmJFZhcjIpCnBsb3RfZGYkVmFyMltwbG90X2RmJFZhcjI9PSIxX3dwaV9wb3MiXSA9ICIxX3dwaSIKcGxvdF9kZiRWYXIyID0gZmFjdG9yKHBsb3RfZGYkVmFyMiwgbGV2ZWxzID0gYygiMV93cGkiLCAiMl93cGkiLCAiNF93cGkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNl93cGkiLCAiOF93cGkiLCAiMTJfd3BpIikpCgpjb2xzX3VzZSA9IGModW5uYW1lKGNvbHNfY2NbZ3JlcGwoImVwZW4iLCBuYW1lcyhjb2xzX2NjKSldW2MoMSwxNSw4KV0pLCAiIzYwOTFiYSIsICIjZDA1OTU5IiwKICAgICAgICAgICAgICIjZmViNzJhIiwgIiNFNjUzMEQiLCAiI0U0M0Q4OCIsICIjNzEyMTY2IikKbmFtZXMoY29sc191c2UpID0gYygiZXBlbl9hIiwgImVwZW5fbiIsICJlcGVuX3EiLCAiZ2x1dCIsICJHQUJBIiwgIm5wYyIsIAogICAgICAgICAgICAgICAgICAgICJtaWNyb2dsaWEiLCAib2xpZ29kZW5kcm9jeXRlIiwgImVuZG90aGVsaWFsIikKbG5fcGx0ID0gZ2dwbG90KHBsb3RfZGYsIGFlcyh4ID0gVmFyMiwgeSA9IHZhbHVlLCAKICAgICAgICAgICAgICAgICAgICBncm91cCA9IG1ham9yY3QsIGNvbG91ciA9IG1ham9yY3QpKSsKICBnZW9tX3BvaW50KHNpemUgPSAxKSsKICBnZW9tX2xpbmUoKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbHNfdXNlKSsKICBsYWJzKHggPSAidGltZSAod3BpKSIsIHkgPSAicHJvcG9ydGlvbiBwZXIgdGltZXBvaW50IiwKICAgICAgIGNvbG91ciA9ICJtYWpvciBjZWxsIHR5cGVcbihwcmVkaWN0ZWQpIikrCiAgdGhlbWVfY2xhc3NpYygpKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEvMiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcuNSksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNy41KSwKICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNTUsICJjbSIpKQoKcGRmKCJyZXN1bHRzL0Rpdi1zZXEvRGl2c2VxX3Jlc3VsdHMvZGl2c2VxX21ham9yY3RfbGluZXMucGRmIiwgaGVpZ2h0ID0gMywgd2lkdGggPSA1KQpwcmludChsbl9wbHQpCmRldi5vZmYoKQpgYGAKCgoKIyBJbnRlZ3JhdGluZyBTUyBhbmQgMSB3cGkgbmVnCkxvYWQgZGF0YQoKYGBge3J9CmF4X3NyYXQgPSByZWFkUkRTKCJkYXRhL2V4cHJlc3Npb24vYXhvbG90bF9yZWNsdXN0L2FsbF9udWNsZWlfY2x1c3RlcmVkX2hpZ2hsZXZlbF9hbm5vLlJEUyIpCm1ldGEgPSByZWFkLmNzdigiZGF0YS9hbm5vdGF0aW9ucy9heG9sb3RsX2FsbF91bWV0YS5jc3YiLCAKICAgICAgICAgICAgICAgIGhlYWRlciA9IFQsIHJvdy5uYW1lcyA9IDEpCmF4X3NyYXQgPSBBZGRNZXRhRGF0YShheF9zcmF0LCBtZXRhZGF0YSA9IG1ldGEpCm1ldGFfcmVncyA9IHJlYWQuY3N2KCJkYXRhL3Byb2Nlc3NlZC9tdWx0aW9tZS9XUF9yZWdpb25fcHJlZGljdGlvbnMuY3N2IiwgCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVCwgcm93Lm5hbWVzID0gMSkKbmV3Y2VsbG5hbWVzID0gcm93bmFtZXMobWV0YV9yZWdzKQpuZXdjZWxsbmFtZXMgPSBnc3ViKCItYTEtMSIsICItMV8xIiwgbmV3Y2VsbG5hbWVzKQpuZXdjZWxsbmFtZXMgPSBnc3ViKCItYTEtMiIsICItMV8yIiwgbmV3Y2VsbG5hbWVzKQpuZXdjZWxsbmFtZXMgPSBnc3ViKCItYTMtMSIsICItMV8zIiwgbmV3Y2VsbG5hbWVzKQpuZXdjZWxsbmFtZXMgPSBnc3ViKCItYTMtMiIsICItMV80IiwgbmV3Y2VsbG5hbWVzKQpyb3duYW1lcyhtZXRhX3JlZ3MpID0gbmV3Y2VsbG5hbWVzCmF4X3NyYXQgPSBBZGRNZXRhRGF0YShheF9zcmF0LCBtZXRhZGF0YSA9IG1ldGFfcmVncykKYXhfc3JhdCRyZWdpb25zX2FsbCA9IGF4X3NyYXQkcHJlZF9yZWdpb25zX3RvcApheF9zcmF0JHJlZ2lvbnNfYWxsW2lzLm5hKGF4X3NyYXQkcmVnaW9uc19hbGwpXSA9IGF4X3NyYXQkcmVnaW9uc1tpcy5uYShheF9zcmF0JHJlZ2lvbnNfYWxsKV0KCm5lZ19zcmF0ID0gcmVhZFJEUygiZGF0YS9leHByZXNzaW9uL2F4b2xvdGxfcmVjbHVzdC9kaXZzZXFfMXdwaV9uZWcuUkRTIikKcmVnX3ByZWQgPSByZWFkLmNzdigicmVzdWx0cy9EaXYtc2VxL3ByZWRzX2xyX3JlZ2lvbnNfbmVnX2FsbC5jc3YiLCBoZWFkZXIgPSBULCByb3cubmFtZXMgPSAxKQpjdF9wcmVkID0gcmVhZC5jc3YoInJlc3VsdHMvRGl2LXNlcS9wcmVkc19yZmNfQ1RfbmVnX2FsbC5jc3YiLCBoZWFkZXIgPSBULCByb3cubmFtZXMgPSAxKQoKbmVnX3NyYXQkcHJlZF9yZWdzID0gcmVnX3ByZWRbY29sbmFtZXMobmVnX3NyYXQpLCJwcmVkX2xyIl0KbmVnX3NyYXQkcHJlZF9jdGFsbCA9IGN0X3ByZWRbY29sbmFtZXMobmVnX3NyYXQpLCJwcmVkX3JmYyJdCmBgYAoKTWVyZ2UgZGF0YXNldHMKCmBgYHtyfQojIGZpbHRlciBtZXRhZGF0YQpheF9zcmF0QG1ldGEuZGF0YSA9IGF4X3NyYXRAbWV0YS5kYXRhWyxjKCJuQ291bnRfUk5BIiwgIm5GZWF0dXJlX1JOQSIsICJwZXJjZW50Lm10IiwgImNoZW0iLCAiaGlnaF9sZXZlbF9hbm5vIiwgImNlbGxjbHVzdGVycyIsICJyZWdpb25zX2FsbCIpXQpjb2xuYW1lcyhheF9zcmF0QG1ldGEuZGF0YSlbNF0gPSAic2FtcGxlIgpuZWdfc3JhdEBtZXRhLmRhdGEgPSBuZWdfc3JhdEBtZXRhLmRhdGFbLGMoIm5Db3VudF9STkEiLCAibkZlYXR1cmVfUk5BIiwgInBlcmNlbnQubXQiLCAic2FtcGxlIiwgInNldXJhdF9jbHVzdGVycyIsICJwcmVkX2N0YWxsIiwgInByZWRfcmVncyIpLCBkcm9wID0gRl0KCmF4X25lZ19zcmF0ID0gbWVyZ2UoYXhfc3JhdCwgbmVnX3NyYXQpCmBgYAoKSm9pbnQgcHJvY2Vzc2luZwoKYGBge3J9CmF4X25lZ19zcmF0JHNhbXBsZV9kYXQgPSBheF9uZWdfc3JhdCRzYW1wbGUKYXhfbmVnX3NyYXQkc2FtcGxlX2RhdFtncmVwbCgid3BpIiwgYXhfbmVnX3NyYXQkc2FtcGxlX2RhdCldID0gImRpdiIKYXhfbmVnX3NyYXQgPSBOb3JtYWxpemVEYXRhKGF4X25lZ19zcmF0KQpheF9uZWdfc3JhdCA9IEZpbmRWYXJpYWJsZUZlYXR1cmVzKGF4X25lZ19zcmF0LCBuZmVhdHVyZXMgPSAxMDAwMCkKYXhfbmVnX3NyYXQgPSBTY2FsZURhdGEoYXhfbmVnX3NyYXQsIHZhcnMudG8ucmVncmVzcyA9IGMoIm5Db3VudF9STkEiLCAicGVyY2VudC5tdCIsICJzYW1wbGVfZGF0IikpCmF4X25lZ19zcmF0ID0gUnVuUENBKGF4X25lZ19zcmF0LCB2ZXJib3NlID0gRikKRWxib3dQbG90KGF4X25lZ19zcmF0LCBuZGltcyA9IDUwKQpgYGAKClJ1biBVTUFQCgpgYGB7cn0KYXhfbmVnX3NyYXQgPSBSdW5VTUFQKGF4X25lZ19zcmF0LCBkaW1zID0gMToyMCwgdmVyYm9zZSA9IEYpClVNQVBQbG90KGF4X25lZ19zcmF0LCBncm91cC5ieSA9ICJzYW1wbGVfZGF0IikKVU1BUFBsb3QoYXhfbmVnX3NyYXQsIGdyb3VwLmJ5ID0gImNlbGxjbHVzdGVycyIpCmBgYAoKSW50ZWdyYXRlIHdpdGggSGFybW9ueSBiYXNlZCBvbiBtdWx0aW9tZS92My4xL2Rpdi1zZXEKCmBgYHtyfQpheF9uZWdfc3JhdEByZWR1Y3Rpb25zJGhhcm1vbnkgPSBOVUxMCmF4X25lZ19zcmF0QHJlZHVjdGlvbnMkdW1hcF9oYXJtb255ID0gTlVMTAojIFJ1biBIYXJtb255CmF4X25lZ19zcmF0ID0gaGFybW9ueTo6UnVuSGFybW9ueShheF9uZWdfc3JhdCwgZ3JvdXAuYnkudmFycyA9ICJzYW1wbGVfZGF0IiwgdGF1ID0gMzAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF9jb252ZXJnZW5jZSA9IEYsIGFzc2F5LnVzZSA9ICJSTkEiKQoKIyBSdW4gVU1BUCBvbiBIYXJtb255IGRpbWVudGlvbnMKYXhfbmVnX3NyYXQgPSBSdW5VTUFQKGF4X25lZ19zcmF0LCByZWR1Y3Rpb24gPSAiaGFybW9ueSIsIAogICAgICAgICAgICAgICAgICAgICAgZGltcyA9IDE6MTUsIHJlZHVjdGlvbi5uYW1lID0gInVtYXBfaGFybW9ueSIpCmBgYAoKQ2hlY2sgaW50ZWdyYXRpb24KCmBgYHtyfQpheF9uZWdfc3JhdCRzYW1wbGVfc2ltcCA9IGF4X25lZ19zcmF0JHNhbXBsZQpheF9uZWdfc3JhdCRzYW1wbGVfc2ltcFtheF9uZWdfc3JhdCRzYW1wbGVfc2ltcCE9IjFfd3BpX25lZyJdID0gIlNTIgpheF9uZWdfc3JhdCRjdGxhYmVscyA9IGF4X25lZ19zcmF0JGNlbGxjbHVzdGVycwpheF9uZWdfc3JhdCRjdGxhYmVsc1tpcy5uYShheF9uZWdfc3JhdCRjdGxhYmVscyldID0gYXhfbmVnX3NyYXQkcHJlZF9jdGFsbFtpcy5uYShheF9uZWdfc3JhdCRjdGxhYmVscyldCmF4X25lZ19zcmF0JHJlZ2xhYmVscyA9IGF4X25lZ19zcmF0JHJlZ2lvbnNfYWxsCmF4X25lZ19zcmF0JHJlZ2xhYmVsc1tpcy5uYShheF9uZWdfc3JhdCRyZWdsYWJlbHMpXSA9IGF4X25lZ19zcmF0JHByZWRfcmVnc1tpcy5uYShheF9uZWdfc3JhdCRyZWdsYWJlbHMpXQpEaW1QbG90KGF4X25lZ19zcmF0LCBncm91cC5ieSA9ICJzYW1wbGVfZGF0IiwgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIpCkRpbVBsb3QoYXhfbmVnX3NyYXQsIGdyb3VwLmJ5ID0gImN0bGFiZWxzIiwgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIpCnBsdDEgPSBEaW1QbG90KGF4X25lZ19zcmF0LCBncm91cC5ieSA9ICJjdGxhYmVscyIsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCAKICAgICAgICAgICAgICAgbGFiZWwgPSBULCBzcGxpdC5ieSA9ICJzYW1wbGVfZGF0IikKcGx0MiA9IERpbVBsb3QoYXhfbmVnX3NyYXQsIGdyb3VwLmJ5ID0gImN0bGFiZWxzIiwgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIsIAogICAgICAgICAgICAgICBsYWJlbCA9IFQsIHNwbGl0LmJ5ID0gInNhbXBsZSIpCnBsdDMgPSBEaW1QbG90KGF4X25lZ19zcmF0LCBncm91cC5ieSA9ICJzYW1wbGVfZGF0IiwgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIsIGxhYmVsID0gVCkKcGx0NCA9IERpbVBsb3QoYXhfbmVnX3NyYXQsIGdyb3VwLmJ5ID0gInJlZ2xhYmVscyIsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCBsYWJlbCA9IFQpCnBsdDUgPSBEaW1QbG90KGF4X25lZ19zcmF0LCBncm91cC5ieSA9ICJjdGxhYmVscyIsIHJlZHVjdGlvbiA9ICJ1bWFwX2hhcm1vbnkiLCAKICAgICAgICAgICAgICAgbGFiZWwgPSBULCBzcGxpdC5ieSA9ICJyZWdsYWJlbHMiKQoKRGltUGxvdChheF9uZWdfc3JhdCwgZ3JvdXAuYnkgPSAiY3RsYWJlbHMiLCByZWR1Y3Rpb24gPSAidW1hcF9oYXJtb255IiwgCiAgICAgICAgbGFiZWwgPSBULCBzcGxpdC5ieSA9ICJzYW1wbGVfc2ltcCIpK05vTGVnZW5kKCkKRGltUGxvdChheF9uZWdfc3JhdCwgZ3JvdXAuYnkgPSAic2FtcGxlX3NpbXAiLCByZWR1Y3Rpb24gPSAidW1hcF9oYXJtb255IikKYGBgCgpDbHVzdGVyaW5nCgpgYGB7cn0KYXhfbmVnX3NyYXQgPSBGaW5kTmVpZ2hib3JzKGF4X25lZ19zcmF0LCByZWR1Y3Rpb24gPSAiaGFybW9ueSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltcyA9IDE6MTUsIGdyYXBoLm5hbWUgPSAiaW50ZWdOZWciKQpheF9uZWdfc3JhdCA9IEZpbmRDbHVzdGVycyhheF9uZWdfc3JhdCwgcmVzb2x1dGlvbiA9IGMoMC44LCAxLCAxLjUsIDIsIDIuNSwgMywgNSwgMTApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGgubmFtZSA9ICJpbnRlZ05lZyIsIGFsZ29yaXRobSA9IDIsIHZlcmJvc2UgPSBGKQoKRGltUGxvdChheF9uZWdfc3JhdCwgZ3JvdXAuYnkgPSAiaW50ZWdOZWdfcmVzLjEwIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXBfaGFybW9ueSIsIGxhYmVsID0gVCkrTm9MZWdlbmQoKQpgYGAKCkRFIGJldHdlZW4gcHJvdG9jb2xzCgpgYGB7cn0KbWtfb3ZlcmFsbCA9IHByZXN0bzo6d2lsY294YXVjKGF4X25lZ19zcmF0LCBncm91cF9ieSA9ICJzYW1wbGVfc2ltcCIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKc2F2ZVJEUyhta19vdmVyYWxsLCBmaWxlID0gInJlc3VsdHMvRGl2LXNlcS9TU18xd3BpbmVnX292ZXJhbGxfREUuUkRTIikKCiMgREUgcGVyIGNlbGwgdHlwZQpjdF9ta19sID0gbGlzdCgpCmZvcihjdCBpbiB1bmlxdWUoYXhfbmVnX3NyYXQkY3RsYWJlbHMpKXsKICBzdWJfZGF0ID0gYXhfbmVnX3NyYXRbLGF4X25lZ19zcmF0JGN0bGFiZWxzPT1jdF0KICBpZihsZW5ndGgodW5pcXVlKHN1Yl9kYXQkc2FtcGxlX3NpbXApKT4xKXsKICAgIGN0X21rX2xbW2N0XV0gPSBwcmVzdG86OndpbGNveGF1YyhzdWJfZGF0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieSA9ICJzYW1wbGVfc2ltcCIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKICB9Cn0Kc2F2ZVJEUyhjdF9ta19sLCBmaWxlID0gInJlc3VsdHMvRGl2LXNlcS9TU18xd3BpbmVnX2NlbGx0eXBlX0RFLlJEUyIpCgojIERFIHBlciBjbHVzdGVyCmNsX21rX2wgPSBsaXN0KCkKZm9yKGNsIGluIHVuaXF1ZShheF9uZWdfc3JhdCRpbnRlZ05lZ19yZXMuMTApKXsKICAgIHN1Yl9kYXQgPSBheF9uZWdfc3JhdFssYXhfbmVnX3NyYXQkaW50ZWdOZWdfcmVzLjEwPT1jbF0KICBpZihsZW5ndGgodW5pcXVlKHN1Yl9kYXQkc2FtcGxlX3NpbXApKT4xKXsKICAgIGNsX21rX2xbW2NsXV0gPSBwcmVzdG86OndpbGNveGF1YyhzdWJfZGF0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieSA9ICJzYW1wbGVfc2ltcCIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKICB9Cn0Kc2F2ZVJEUyhjbF9ta19sLCBmaWxlID0gInJlc3VsdHMvRGl2LXNlcS9TU18xd3BpbmVnX2NsdXN0ZXJfREUuUkRTIikKYGBgCgpGaWx0ZXIgdGhlIERFIGdlbmVzIHRvIHRob3NlIHNpZ25pZmljYW50IGFuZCBtZWFuaW5nZnVsCgpgYGB7cn0KY3RfbWtfbF9maWx0ID0gbGlzdCgpCmZvcihuIGluIG5hbWVzKGN0X21rX2wpKXsKICBjdF9ta19sX2ZpbHRbW25dXSA9IGN0X21rX2xbW25dXVtjdF9ta19sW1tuXV0kcGFkajw9MC4wNSAmIGN0X21rX2xbW25dXSRsb2dGQz49MC4zLF0KICBjdF9ta19sX2ZpbHRbW25dXSA9IGN0X21rX2xfZmlsdFtbbl1dWyFzdGFydHNXaXRoKGN0X21rX2xfZmlsdFtbbl1dJGZlYXR1cmUsICJBTUVYIikgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0YXJ0c1dpdGgoY3RfbWtfbF9maWx0W1tuXV0kZmVhdHVyZSwgIkxPQyIpICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFncmVwbCgiLi4iLCBjdF9ta19sX2ZpbHRbW25dXSRmZWF0dXJlLCBmaXhlZCA9IFQpLF0KfQoKY2xfbWtfbF9maWx0ID0gbGlzdCgpCmZvcihuIGluIG5hbWVzKGNsX21rX2wpKXsKICBjbF9ta19sX2ZpbHRbW25dXSA9IGNsX21rX2xbW25dXVtjbF9ta19sW1tuXV0kcGFkajw9MC4wNSAmIGNsX21rX2xbW25dXSRsb2dGQz49MC4zLF0KICBjbF9ta19sX2ZpbHRbW25dXSA9IGNsX21rX2xfZmlsdFtbbl1dWyFzdGFydHNXaXRoKGNsX21rX2xfZmlsdFtbbl1dJGZlYXR1cmUsICJBTUVYIikgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGFydHNXaXRoKGNsX21rX2xfZmlsdFtbbl1dJGZlYXR1cmUsICJMT0MiKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWdyZXBsKCIuLiIsIGNsX21rX2xfZmlsdFtbbl1dJGZlYXR1cmUsIGZpeGVkID0gVCksXQp9CmBgYAoKQ291bnQgREUgZ2VuZXMgcGVyIGNlbGwgdHlwZSBhbmQgY29uZGl0aW9uCgpgYGB7cn0Kbl9kZSA9IG1hdHJpeCgwLCBuY29sID0gMiwgbnJvdyA9IGxlbmd0aChjdF9ta19sX2ZpbHQpKQpjb2xuYW1lcyhuX2RlKSA9IGMoIlNTIiwgIjFfd3BpX25lZyIpCnJvd25hbWVzKG5fZGUpID0gbmFtZXMoY3RfbWtfbF9maWx0KQpmb3IobiBpbiBuYW1lcyhjdF9ta19sX2ZpbHQpKXsKICB0YWIgPSB0YWJsZShjdF9ta19sX2ZpbHRbW25dXSRncm91cCkKICBuX2RlW24sICJTUyJdID0gdGFiWyJTUyJdCiAgbl9kZVtuLCAiMV93cGlfbmVnIl0gPSB0YWJbIjFfd3BpX25lZyJdCn0Kbl9kZVtpcy5uYShuX2RlKV0gPSAwCgpuX2RlX2NsID0gbWF0cml4KDAsIG5jb2wgPSAyLCBucm93ID0gbGVuZ3RoKGNsX21rX2xfZmlsdCkpCmNvbG5hbWVzKG5fZGVfY2wpID0gYygiU1MiLCAiMV93cGlfbmVnIikKcm93bmFtZXMobl9kZV9jbCkgPSBuYW1lcyhjbF9ta19sX2ZpbHQpCmZvcihuIGluIG5hbWVzKGNsX21rX2xfZmlsdCkpewogIHRhYiA9IHRhYmxlKGNsX21rX2xfZmlsdFtbbl1dJGdyb3VwKQogIG5fZGVfY2xbbiwgIlNTIl0gPSB0YWJbIlNTIl0KICBuX2RlX2NsW24sICIxX3dwaV9uZWciXSA9IHRhYlsiMV93cGlfbmVnIl0KfQpuX2RlX2NsW2lzLm5hKG5fZGVfY2wpXSA9IDAKYGBgCgpHZXQgR08gVGVybXMsIHdpdGhvdXQgcmVwZWF0ZWQgZ2VuZXMKCmBgYHtyfQpnZW5lc19jb21tID0gYygpCmZvcihjdCBpbiBuYW1lcyhjdF9ta19sX2ZpbHQpKXsKICBpZihhbnkobl9kZVtjdCxdPj0xMDApKXsKICAgIGcgPSBjdF9ta19sX2ZpbHRbW2N0XV0kZmVhdHVyZQogICAgZ2VuZXNfY29tbSA9IGMoZ2VuZXNfY29tbSwgZykKICB9Cn0KY29tbW9uID0gbmFtZXModGFibGUoZ2VuZXNfY29tbSlbdGFibGUoZ2VuZXNfY29tbSk+PTRdKQoKZ29fY3RfbDIgPSBsaXN0KCkKZm9yKGN0IGluIG5hbWVzKGN0X21rX2xfZmlsdCkpewogIGZvcihnIGluIGNvbG5hbWVzKG5fZGUpKXsKICAgIGlmKG5fZGVbY3QsZ10+PTEwMCl7CiAgICAgIGlkID0gcGFzdGUwKGN0LCAiLi4iLCBnKQogICAgICBnZW5lcyA9IGN0X21rX2xfZmlsdFtbY3RdXSRmZWF0dXJlW2N0X21rX2xfZmlsdFtbY3RdXSRncm91cD09Z10KICAgICAgIwogICAgICBnZW5lcyA9IGdlbmVzWyEoZ2VuZXMgJWluJSBjb21tb24pXQogICAgICBnb19jdF9sMltbaWRdXSA9IGdwcm9maWxlcjI6Omdvc3QoZ2VuZXMsIG9yZGVyZWRfcXVlcnkgPSBGLCBzb3VyY2VzPSJHTzpCUCIpJHJlc3VsdAogICAgfQogIH0KfQpgYGAKCkNvbXBhcmUgY2x1c3RlcnMgYW5kIGNvbmRpdGlvbnMgYW5kIGNlbGwgdHlwZXMKCmBgYHtyfQpkZl9jdGNsID0gZGF0YS5mcmFtZSh0YWJsZShheF9uZWdfc3JhdCRjdGxhYmVscywgYXhfbmVnX3NyYXQkaW50ZWdOZWdfcmVzLjEwKSkKcGhlYXRtYXA6OnBoZWF0bWFwKHRhYmxlKGF4X25lZ19zcmF0JGN0bGFiZWxzLCBheF9uZWdfc3JhdCRpbnRlZ05lZ19yZXMuMTApLCAKICAgICAgICAgICAgICAgICAgIGZvbnRzaXplID0gNi41LCBjbHVzdGVyaW5nX21ldGhvZCA9ICJ3YXJkLkQiLCBzY2FsZSA9ICJyb3ciKQoKZGZfY2xjdCA9IGRhdGEuZnJhbWUodGFibGUoYXhfbmVnX3NyYXQkaW50ZWdOZWdfcmVzLjEwLCBheF9uZWdfc3JhdCRzYW1wbGVfc2ltcCkpCnRhYl9zID0gcHJvcC50YWJsZSh0YWJsZShheF9uZWdfc3JhdCRpbnRlZ05lZ19yZXMuMTAsIGF4X25lZ19zcmF0JHNhbXBsZV9zaW1wKSwgbWFyZ2luID0gMikKcGhlYXRtYXA6OnBoZWF0bWFwKHRhYl9zLCBmb250c2l6ZSA9IDYuNSwgY2x1c3RlcmluZ19tZXRob2QgPSAid2FyZC5EIikKcGhlYXRtYXA6OnBoZWF0bWFwKHRhYl9zW3RhYl9zWywxXT50YWJfc1ssMl0qMS4xLF0sIGZvbnRzaXplID0gNi41LCBjbHVzdGVyaW5nX21ldGhvZCA9ICJ3YXJkLkQiKQpgYGAKQ291bnQgbnVtYmVyIG9mIERFIGdlbmVzIC0gcGxvdAoKYGBge3J9CnBsb3RfZGYgPSByZXNoYXBlMjo6bWVsdChuX2RlKQpvcmQgPSByb3dTdW1zKG5fZGUpCnBsb3RfZGYkVmFyMSA9IGZhY3RvcihwbG90X2RmJFZhcjEsIGxldmVscyA9IHJvd25hbWVzKG5fZGUpW29yZGVyKG9yZCwgZGVjcmVhc2luZyA9IFQpXSkKCmdncGxvdChwbG90X2RmLCBhZXMoeCA9IFZhcjEsIHkgPSB2YWx1ZSwgZmlsbCA9IFZhcjIpKSsKICBnZW9tX2NvbCgpKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCwgbWF4KG9yZCkrbWF4KG9yZCkqMC4wNSkpKwogIGxhYnMoeCA9ICJDZWxsIFR5cGVzIiwgeSA9ICIjIERFIGdlbmVzIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKU2F2ZSBkYXRhCgpgYGB7cn0Kc2F2ZVJEUyhheF9uZWdfc3JhdCwgZmlsZSA9ICJkYXRhL3Byb2Nlc3NlZC9TU18xd3BpTmVnX3NyYXQuUkRTIikKYGBgCgoKCg==